第一次搭建项目,毕业设计。为了增加难度,选择了springmvc+spring4+hibernate4的框架。搭建过程中各种不顺,由于第一次碰到jar包冲突的问题,在这里卡了很久,现在记录下来。
先报错:org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException,按照网上搜到的材料,是缺少aspectjweaver.jar,导入后,仍然报错。
花了一晚上的时间重新定位错误,发现在UserServiceImpl类中,一旦加上@transactional 标签就出现上述错误,去掉@transactional 就不报错。一度怀疑我的xml配置有问题,又花了一天的时间重新研究了spring的xml配置文件,仔细查看了<aop>和<tx>标签的配置,反复修改仍然报错。期间甚至被误导以为是Spring中的AOP以及声明式事务 @Transactional无法拦截事务,然后又搜了相关的文章,http://www.iteye.com/problems/2646,报错依旧。
在排除各种原因,尝试各种方法后,又回到jar包的问题,存在“jar包导入了,但是编译时不存在”的问题,然后我怀疑maven出问题了!或许是依赖的包没下载全,或者文件缺失,我到本地.m2仓库下,找到aspectjweaver文件夹,哈哈,空也!正当我为找到病因高兴时,突然发现,这是1.5.4的版本,我记得我pom中引用的是1.8的版本啊。。。
又找到这个文件夹,我就知道又错了。每个文件还有sha1,根本就不可能出现下载过程中文件出错的情况。。。我还是不相信maven,然后我把pom中的依赖注释掉了,手动导入这个包到项目lib中,终于!这个错误没了!!!!!可是又诞生了另一个错误了!!spring中的某个类找不到,我又按照这个方法,找到jar包,取消依赖,手动导入到lib中,只到所有的错误消失!
最后终于在tomcat中跑起来了~~~~兴奋的推到git,记录为“搞定框架”~
我真是图样图森破啊,以为这就结束了。。
吃过晚饭,给我的舍友秀了一下后,还一切正常。
开始动手写业务,刚写了一个功能,调试就报错了,hibernate的某个类找不到?不应该啊,我明明导入了啊,再次取消maven依赖,手工添加到lib,还是报错!真是坑爹,我把新加的代码全部注释掉,回滚到上次正常跑起来的状态,晕,这次竟然跑不起来了。。。我用git回滚,也跑不起来了!
提交到git之前能跑起来,回滚之后竟然跑步起来?真是怪事。我又检查了下没上传到git的.idea的文件,没问题,排除。
这个时候,我隐隐觉得什么地方不对了。同样的代码前一次执行和后一次执行竟然不一样?这里代码全是写死的,没有random啥的啊,有违常理啊。那么真相只有一个!某个地方有A,有B,第一次执行了A,第二次执行了B!而且这个AB在我看不到的地方,那是啥,jar包冲突呗!!!!
这冲突的多明显啊!不报错才怪,接着我把所有的依赖全打上,本地项目lib清空,按照 http://www.javaranger.com/archives/1232 在intellij里解决了冲突的包。
至此,所有的问题才算解决!
总结,以前只是知道,部署到tomca里时,要把servlet-api和jsp-api两个包删除,那是我接触到的唯一的包冲突的实例。经过这次教训,总算彻底的认识到jar包冲突的问题了:很隐蔽!没有经验根本无法发现,这也是使用maven带来的弊端吧,间接引进的包太多。
头疼医脚,好处也是蛮多的,至少我对spring项目搭建、配置文件的作用了解更多了。哈哈,夏医生下次也可以看脚病了哦~