我在与当Oracle应用服务器上的jar
文件中部署未找到Hibernate的资源的问题。部署到Oracle应用服务器时未找到Hibernate映射?
我在LocalSessionFactoryBean
定义了一些Hibernate映射文件如下:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingLocations">
<list>
<value>classpath:/mapping/*.hbm.xml</value>
</list>
</property>
...
</bean>
这个bean定义是在一个文件中applicationContext.xml
。
休眠映射,这些映射引用的类和applicationContext.xml
文件位于模块foo
中,该模块产生工件foo.jar
。
我创建了一个.ear
,它引用foo.jar
并使用相同的applicationContext.xml
文件。当我部署.ear
到Oracle应用服务器我看到以下错误:
java.io.FileNotFoundException: class path resource [mapping/] cannot be resolved to absolute file path because it does not reside in the file system: code-source:/.../oas10.1.3/j2ee/.../applications/.../WEB-INF/lib/foo.jar!mapping/
当我审视/WEB-INF/lib/foo.jar
我可以看到mappings
目录与Hibernate映射文件预期。
其合理性检查我创建了一个依赖一个简单的项目上foo
并运行以下测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class AppTest {
@Autowired SessionFactory sessionFactory;
@Test
public void loadObjects() {
Session session = sessionFactory.openSession();
List<Foo> results = session.createQuery("from Foo").list();
System.out.println("found " + results.size() + " results");
}
}
这按预期工作:HQL查询运行和我回去富的正确数量来自数据库的对象。
那么,为什么如此简单的应用程序引用在foo.jar
工作的映射资源,但甲骨文的应用服务器上做同样的事情会导致资源没有发现?
编辑:我尝试使用mappingJarLocations
代替mappingLocations
:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingJarLocations">
<list>
<value>WEB-INF/lib/foo.jar</value>
</list>
</property>
...
</bean>
,并得到了FileNotFoundException
。
编辑:我回去使用mappingLocations
代替mappingJarLocations
(在我的第一个例子),但这次我直接复制我的*.hbm.xml
文件到.war
文件的WEB-INF/classes
目录。
毫不奇怪,这工作:
setMappingLocations() - file:/.../oas10.1.3/j2ee/.../applications/.../raps-site-9.0/WEB-INF/classes/mapping/Address.hbm.xml
我会尽量实用JAR的建议,但作为一项临时措施,我会改变我的pom.xml
的映射直接复制到WEB-INF/classes
。
感谢您的回复。目前'foo.jar'存在于'bar.war'文件中,然后放入'.ear'中。部署时,存在一个“WEB-INF/lib/foo.jar”文件。是否仍然需要创建实用程序jar? – 2013-04-11 11:46:28
AFAIK实用程序jar必须位于'.ear'的根目录,并且引用的是'bar.war'的清单 请参阅http://stackoverflow.com/questions/15828781/architecture-of-a-java-ee-项目或http://www.coderanch.com/t/309491/EJB-JEE/java/utility-JAR-EAR-WAR – Gab 2013-04-11 12:00:01
其实我用'file:**/foo.jar'指定了一个'mappingJarLocations'属性,这似乎是个窍门。但是现在我得到了'未知实体'的例外。前进两步,后退一步... – 2013-04-11 12:17:55