2011-11-23 37 views
0

我有基於Hibernate和Spring(編程配置)的web項目。 Hibernate映射在包中存儲在一個JAR中。Spring + Hibernate Session Factory:映射JAR內的文件目錄

當涉及到初始化會話工廠我習慣叫:

sessionFactory. 
    setMappingDirectoryLocations(new Resource[]{ 
     new ClassPathResource("org/all/theway/to/hibernatemappings")}); 

爲了告訴Hibernate在何處尋找映射文件。 「org/all/theway/to/hibernatemappings」是包含hbm.xml文件的包。這在Eclipse(GWT dev模式)下工作正常,因爲包含映射的項目也被簽出並鏈接到我的web項目。但是,一旦我創建了一個戰爭並將它部署到Tomcat,它就無法獲得類路徑資源。

Spring的使用ClassPathResource的javadoc暗示這一點:「支持的分辨率的java.io.File如果類路徑的資源存在於文件系統,而不是在JAR資源始終支持作爲URL解析。」

但是做什麼呢?我也可以使用setMappingJarLocation,但我不喜歡在我的Spring上下文中對一個jar文件名進行硬編碼。此外,當我嘗試它時,它也只能在IDE中工作,但在Tomcat中相同的文件路徑(WEB-INF/lib/file.jar)不起作用。這也使我相信這將是一個醜陋的解決方案。

是否有一種解決方法可以在不使用jar文件的情況下工作?

回答

0

並不是真正的原始問題的解決方案,但它避免了處理配置代碼中的jar文件的文件系統文件名的workarounnd:

我只是告訴螞蟻有問題的JAR解壓到WEB-INF/classes文件夾

<target name="unpack.hibernatemappings"> 
    <unzip dest="${war.dir}/WEB-INF/classes"> 
     <fileset dir="${lib.dir}"> 
      <include name="archive-containing-the-hbm-files.jar"/> 
     </fileset> 
    </unzip> 
</target> 

現在,在Hibernate映射駐留在文件系統和可以訪問如使用ClassPathResource(像問題的例子)。

1

這工作

//所有應用程序上下文實現ResourcePatternResolver

ResourcePatternResolver resourcePatternResolver= applicationContext; 
sessionFactory.setMappingDirectoryLocations(resourcePatternResolver.getResources("classpath*:org/all/theway/to/hibernatemappings/*.hbm.xml")); 

編輯:用ResourcePatternResolver替換DefaultResourceLoader。

+0

謝謝,但很抱歉,沒有幫助:java.io.FileNotFoundException:類路徑資源[classpath *:/ org/all/theway/to/hibernatemapping]無法解析爲URL,因爲它不存在 – rainer198

+0

您是否包含*之後的'/',或者它在錯誤信息中,儘管你沒有包含它?通常當通過在路徑之前提供'classpath *'來獲取jar文件中的東西時。 Spring的LocalSessionFactoryBean在xml配置中接受這個模式。檢查https://jira.springsource.org/browse/SPR-469。在調試Spring代碼後,我給了你相當於xml配置。 – Adi

+1

@ rainer198對不起,我意識到我以前的答案中所犯的錯誤。檢查編輯後的答案,如果您仍然在尋找不同的解決方案,它可以不加修改地工作。 – Adi