标签:
一个小小的路劲分隔符,可以足足耽误一天的工作时间。这两天在构建一个以apache cxf为基础的restful webservice的小程序时,就卡在这个上面了。幸好运气不错,胡乱猜测加试验,找到了问题的所在。真不敢想象,如果人品背点不知道会被耽误多少时间。
问题就是在hibernate的cfg.xml中配置的mapping文件路径。当时图方便也为了防止拼写错误,就直接从windows浏览器中拷贝了路劲地址贴到cfg.xml中。windows的路径分割符是“\”。像这样的路径,如果是在java文件中,会需要使用转译符,否则编译会报错。当然使用 File.separator 才是最好的做法。
String str = "cn\\edu\\hdu\\grs\\tdlab\\domain\\hbm\\User.hbm.xml";
但在xml配置文件中,没有这么严格检查,配置如下:
<mapping resource="cn\edu\hdu\grs\tdlab\domain\hbm\User.hbm.xml"></mapping>
然后运行单元测试实现简单的CRUD,OK通过。最后使用gradle的application插件,发布成zip包。
本以为大功告成,然而在运行bat脚本时,错误出现了,提示hbm.xml找不到。
Exception in thread "main" org.hibernate.MappingNotFoundException: resource: cn\edu\hdu\grs\tdlab\domain\hbm\User.hbm.xml not found
虽然报错很明显提示找不到文件,但由于单元测试全部OK,所以没去怀疑路劲问题。一开始以为是打了jar包的问题,然后度娘出来一堆hibernate包含jar包中的hbm文件的文章。但这些文章的配置都是和spring集成的,直接使用cfg.xml的我是没找到。spring的 org.springframework.orm.hibernate3.LocalSessionFactoryBean 有mappingJarLocations【1】 , mappingLocations等属性,还能使用通配符配置hbm文件。然而我并不打算使用spring,由于项目很小beans不多,也不需要切面之类的,我就简单的在main中使用了一个静态map来维护beans。
然后我又毫无依据地尝试了一些办法,如:
在mapping路径中加上classpath,classpath*;
合并bin和lib目录,修改bat文件中的classpath,使bat和jar处于同一目录。
都没有成功。网上感觉有用的资料也都翻遍了。没办法,只能退一步,项目总得跑起来啊。于是,抱着死马当活马医的心态,放弃包结构,将hbm文件和cfg文件放在一个目录下,配置变成
<mapping resource="User.hbm.xml"></mapping>
clean,distZip。然后运行启动脚本,成功了。真是运气超好!
这表明我一开始怀疑的cfg.xml不查找jar包中的hbm的猜测是错误的。于是开始怀疑路劲问题,继续加上路劲,使用“/”替换原来的“\”,问题完美解决。
不过我还是很费解,为什么Junit跑起来一点问题都没有。单元测试都能过也给我这次解决问题带来了很大的影响。难道是因为我在windows平台做开发的缘故【2】?看来以后写代码还是要去linux下比较靠谱。
参考资料:
【1】hbm.xml文件在jar文件中 http://blog.csdn.net/ironskinspirit/article/details/6271093
【2】java之路径分隔符介绍 http://www.169it.com/tech-java/article-13812651845528076664.html
标签:
原文地址:http://my.oschina.net/amhuman/blog/500689