我有基于Hibernate和Spring的Web项目(程序化配置)。 Hibernate映射在一个包中提供,该包存储在JAR中。
初始化会话工厂时,我曾经打电话:
sessionFactory.
setMappingDirectoryLocations(new Resource[]{
new ClassPathResource("org/all/theway/to/hibernatemappings")});
为了告诉Hibernate在哪里寻找映射文件。 “org / all / theway / to / hibernatemappings”是包含hbm.xml文件的包。这在Eclipse(GWT开发模式)中运行良好,因为包含映射的项目也被检出并链接到我的Web项目。但是,一旦我创建了一个war并将其部署到Tomcat,它就无法获得类路径资源。
Spring的ClasspathResource javadoc意味着:“如果类路径资源驻留在文件系统中,则支持解析为java.io.File,而不支持JAR中的资源。始终支持解析为URL。 “
但该怎么做呢?我也可以使用setMappingJarLocation,但我不喜欢在Spring上下文中硬编码jar文件名。此外,当我尝试它时,它也只能在IDE中工作,但在Tomcat内部,相同的文件路径(WEB-INF / lib / file.jar)不起作用。这也让我相信这将是一个丑陋的解决方案。
有没有使用jar文件的解决方法?
答案 0 :(得分:1)
这有效
//所有应用程序上下文都实现了ResourcePatternResolver
ResourcePatternResolver resourcePatternResolver= applicationContext;
sessionFactory.setMappingDirectoryLocations(resourcePatternResolver.getResources("classpath*:org/all/theway/to/hibernatemappings/*.hbm.xml"));
编辑:用ResourcePatternResolver替换DefaultResourceLoader。
答案 1 :(得分:0)
不是原始问题的解决方案,而是一个避免在配置代码中处理jar文件的文件系统文件名的workarounnd:
我只是告诉ant将有问题的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访问(如问题示例中所示)。