`
xiaoyaocao
  • 浏览: 273925 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

SpringMVC 工程打成jar包后,hbm.xml文件无法加载,action无法映射的问题

阅读更多

     最近由于项目平台上开发新的子项目,发现平台结构越来越复杂,非常难看,也不便于维护。于是乎将平台基础部分进行了打包,扔到lib里面去。

     jar包打好了,启动tomcat测试,启动时就报错了,说无法创建hibernate的sessionfactory,不可能啊,我没打包之前都是好的,难道打包就不能用了?检查,发现是扫描hbm.xml映射文件失败,于是检查hibernate配置文件,有这么几行代码:

 

<property name="mappingDirectoryLocations">
	<list>
		<value>classpath:com/per/domain</value>
	</list>
</property>

 查阅mappingDirectoryLocations的相关资料,有这么一些描述:

 

写道
LocalSessionFactoryBean有好几个属性用来查找hibernate映射文件:mappingResources、mappingLocations、mappingDirectoryLocations与mappingJarLocations
他们的区别:
mappingResources:指定classpath下具体映射文件名
<property name="mappingResources">
<value>petclinic.hbm.xml </value>
</property>
mappingLocations:可以指定任何文件路径,并且可以指定前缀:classpath、file等
<property name="mappingLocations">
<value>/WEB-INF/petclinic.hbm.xml </value>
</property>

<property name="mappingLocations">
<value>classpath:/com/company/domain/petclinic.hbm.xml </value>
</property>
也可以用通配符指定,'*'指定一个文件(路径)名,'**'指定多个文件(路径)名,例如:
<property name="mappingLocations">
<value>classpath:/com/company/domainmaps/*.hbm.xml </value>
</property>
上面的配置是在com/company/domain包下任何maps路径下的hbm.xml文件都被加载为映射文件

mappingDirectoryLocations:指定映射的文件路径

<property name="mappingDirectoryLocations">
<list>
<value>WEB-INF/HibernateMappings</value>
</list>
</property>
也可以通过classpath来指出
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/XXX/package/</value>
</list>
</property>

mappingJarLocations:指定加载的映射文件在jar文件中

 哦,原来有个mappingJarLocations属性,于是赶紧搜mappingJarLocations的资料,在本网站内看到如下一段内容:

 

http://zprill.iteye.com/blog/716197写道

 

<property name="mappingLocations">
<list>
<value>classpath:com/test/hbm/*.hbm.xml</value>
</list>
</property>
当hbm文件被打成jar包时,上面的方法就不能用了。幸亏org.springframework.orm.hibernate3.LocalSessionFactoryBean还有mappingJarLocations属性。
<property name="mappingJarLocations">
<list>
<value>WEB-INF/lib/test.jar</value>
</list>
</property>

这样就不怕被读不到文件了

 好了,赶快改吧,将上面有问题的代码改成这样:

<property name="mappingJarLocations">
	<list>
		<value>WEB-INF/lib/comm-base.jar</value>
	</list>
</property>
<property name="mappingDirectoryLocations">
	<list>
	       <value>classpath:com/per/**/domain</value>
	</list>
</property>

 重启tomcat ,好了,这下没报错了。不过新的问题来了,原来可以访问的网页现在访问报404错误。奇怪了,再google一把,原来是jar包的问题,跟这位仁兄是一样的问题:

 

http://xinglu.iteye.com/blog/1457029 写道

 

近期在用spring3做一个项目,用到了里面的一个自动扫描组件的特性.但是工程分为了好多个小项目,有个统一的开发平台,这个平台的支撑类会被我做成一个jar包被其它几个子工程引用.

开发的时候使用的是工厂引用工厂的方式,在eclipse里面的classpath里面把该平台工厂引入即可,避免了每次修改了平台代码都要重新打包的问题.这个方法不是在web project类型,对于web-project,还是需要沿用老办法,即打成jar包,然后让web-project引用进来.

这时发现个问题,就是平台下junit测试正常的一些spring bean,到了web-project里面发现无法关联到了.
搞了很久,也上网查了很多资料,一开始以为是要修改<context:component-scan >里面的resource-pattern属性,后来改来改去都解决不了问题.

最后发现一个问题,是我们的eclipse自带的jar打包程序,默认打包的时候有个选项<Add directory entries>没有勾选,只要勾选了,就完全没有问题了,无须再对<context:component-scan >进行任何修改了.

罪恶的<Add directory entries>选项啊!

 

好了,重新打包,再试,ok,问题解决。

 

小细节可真多啊~记录在此,以备后查吧。

分享到:
评论
1 楼 unhappy 2016-03-03  
你好,如果将spring mvc的工程打成jar包,你是如何运行的?是否可以将打好的jar放在其他spring mvc工程中启动运行?

相关推荐

Global site tag (gtag.js) - Google Analytics