2011-11-23 16 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