2013-04-11 73 views
0

我在与当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

回答

0

您需要打包耳朵本身里面的罐子。这种罐子被称为实用罐子。

他们有几种可能的方式来做到这一点,请参阅http://www.ibm.com/developerworks/rational/library/07/1211_schrag/

+0

感谢您的回复。目前'foo.jar'存在于'bar.war'文件中,然后放入'.ear'中。部署时,存在一个“WEB-INF/lib/foo.jar”文件。是否仍然需要创建实用程序jar? – 2013-04-11 11:46:28

+0

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

+0

其实我用'file:**/foo.jar'指定了一个'mappingJarLocations'属性,这似乎是个窍门。但是现在我得到了'未知实体'的例外。前进两步,后退一步... – 2013-04-11 12:17:55

相关问题