网上找了很多,都没有找到想要的,记录一下自己这次误打误撞解决依赖包冲突问题。
环境:工具Myeclipse2014 ,S2SH对应版本如下:
<struts2Version>2.3.30</struts2Version>
<springVersion>4.2.3.RELEASE</springVersion>
<hibernateVersion>4.3.11.Final</hibernateVersion>
以 java.lang.NoSuchMethodError: org.springframework.core.io.ResourceEditor.错误为例(据说这玩意一般是依赖包冲突造成的,或者由于jar包版本问题,调用的方法已经改变,某个版本jar所调用的方法传入的参数与你当前使用的版本所定义的方法传入的参数不一样。)
如果有JAD反编译插件(安装一个也很简单,上网搜索一下就有教程,挺有用的插件),点击蓝色链接部分–init(GenericFilterBean.java:167)会自动跳转到反编译生成的Java文件(非原始源代码)。Ctrl+F查找转到init方法处,查看方法体逻辑,可能会存在多个输入参数不同的init方法,找到方法中有调用ResourceEditor相关的那个init方法。
init方法调用ResourceEditor的构造器参数是ResourceLoader类型的,在左侧的Package Explorer依次展开Maven项目名—>Maven Dependencies,找到ResourceEditor类所在的jar包,打开该类如下,此版本的jar包没有对应的ResourceEditor构造器,就是这个原因报错。
有的时候修改pom.xml文件相应jar包的版本就可以解决,有的时候,你打开pom.xml文件想修改版本却发现你根本没有引用该jar包(sun the dog)。如果是用Maven管理jar包,即使你没有在pom.xml文件里申明使用该jar包,由于jar包之间的依赖,Maven也会自动导入某个jar包依赖的其它jar包(方便管理jar包的同时也带来了难以分析哪些个jar包冲突)。
解决方案(靠运气,可能也要看脸=.=):
- 导致错误的包好找(Maven可以查看某个jar包调用了哪些jar包,要看哪些个jar包调用了这个jar包在Myeclipse下点击该jar包,右键maven->Exclude Maven Artifacets->preview查看从哪些个地方进行了exclusion),org.springframework.core属于spring-core这个包,但是是哪个包调用它导致错误呢,在错误信息显示的调用栈,往下一级一级确定是哪个包出了问题(这个有点靠运气。。。水平有限,对S2SH的学习还很浅,上网搜一搜一些信息,猜测是哪个包的问题。。。。),可以先确定是SSH中哪一层的问题,可以缩小怀疑范围
- 找到可能是这个包出问题–struts2-spring-plugin。这个包调用的另外某个jar包版本与你项目中所使用的jar包版本不一样
- 再次靠脸靠人品,在分析了一个个jar包过程中,一个不小心打开了一个神奇的大门。
右键Maven Dependencies目录中的jar包,Maven->Open Pom,窗口下有很多查看方式,切换查看方式为Dependency Graph,下图就是神器包了–spring-test.jar依赖树):
打开后的依赖jar包树图如下(这是项目无错误运行后的依赖树图,运行错误的依赖树图调用的spring-web版本是3.0.5.RELEASE):
- 找到spring-core可以看到它被哪些包调用以及调用了哪些包,在错误信息显示的调用栈看出是org.springframework.web.filter调用spring-core导致了错误,再看是哪个包调用了org.springframework.web这个jar包,一级级往上,将有问题的版本号从调用它的上级jar包中排除,然后另外导入合适版本的jar包,最好上下级使用统一的版本号
- 在pom.xml文件中排除调用的冲突版本,并添加新版本jar包如下:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>4.2.3</version>
<!-- 排除此处引用的spring-web-3.0.5的包,另外使用4.2.3包,解决包冲突成功 -->
<exclusions>
<exclusion>
<artifactId>spring-web</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.3</version>
</dependency>