2013-04-11 52 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

相關問題