最近由于项目平台上开发新的子项目,发现平台结构越来越复杂,非常难看,也不便于维护。于是乎将平台基础部分进行了打包,扔到lib里面去。 jar包打好了,启动tomcat测试,启动时就报错了,说无法创建hibernate的sessionfactory,不可能啊,我没打包之前都是好的,难道打包就不能用了?检查,发现是扫描hbm.xml映射文件失败,于是检查hibernate配置文件,有这么几行代码:
查阅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./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> 这样就不怕被读不到文件了 好了,赶快改吧,将上面有问题的代码改成这样:
重启tomcat ,好了,这下没报错了。不过新的问题来了,原来可以访问的网页现在访问报404错误。奇怪了,再google一把,原来是jar包的问题,跟这位仁兄是一样的问题:
http://xinglu./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,问题解决。
小细节可真多啊~记录在此,以备后查吧。 |
|