我在與當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