Maven的Jar包冲突导致java.lang.NoSuchMethodError错误
2016-10-13 19:39
627 查看
网上找了很多,都没有找到想要的,记录一下自己这次误打误撞解决依赖包冲突问题。
环境:工具Myeclipse2014 ,S2SH对应版本如下:
以 java.lang.NoSuchMethodError: org.springframework.core.io.ResourceEditor.错误为例(据说这玩意一般是依赖包冲突造成的,或者由于jar包版本问题,调用的方法已经改变,某个版本jar所调用的方法传入的参数与你当前使用的版本所定义的方法传入的参数不一样。)
![](http://img.blog.csdn.net/20161013193030973)
如果有JAD反编译插件(安装一个也很简单,上网搜索一下就有教程,挺有用的插件),点击蓝色链接部分–init(GenericFilterBean.java:167)会自动跳转到反编译生成的Java文件(非原始源代码)。Ctrl+F查找转到init方法处,查看方法体逻辑,可能会存在多个输入参数不同的init方法,找到方法中有调用ResourceEditor相关的那个init方法。
![](http://img.blog.csdn.net/20161013193101852)
init方法调用ResourceEditor的构造器参数是ResourceLoader类型的,在左侧的Package Explorer依次展开Maven项目名—>Maven Dependencies,找到ResourceEditor类所在的jar包,打开该类如下,此版本的jar包没有对应的ResourceEditor构造器,就是这个原因报错。
![](http://img.blog.csdn.net/20161013193132775)
有的时候修改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):
![](http://img.blog.csdn.net/20161013193203442)
找到spring-core可以看到它被哪些包调用以及调用了哪些包,在错误信息显示的调用栈看出是org.springframework.web.filter调用spring-core导致了错误,再看是哪个包调用了org.springframework.web这个jar包,一级级往上,将有问题的版本号从调用它的上级jar包中排除,然后另外导入合适版本的jar包,最好上下级使用统一的版本号
![](http://img.blog.csdn.net/20161013193225755)
在pom.xml文件中排除调用的冲突版本,并添加新版本jar包如下:
环境:工具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>
相关文章推荐
- HTTP Status 500 - java.lang.LinkageError: loader constraint violation: Maven的jar包冲突解决
- maven 项目jar 包冲突 Caused by: java.lang.ClassNotFoundException: org.apache.commons.beanutils.converters
- hibernate 与spring jar包冲突 java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
- jar包导致的错误之java.lang.NoClassDefFoundError: org.achartengine.renderer.XYMultipleSeriesRe
- Maven项目引用本地jar包,编译后出现java.lang.NoClassDefFoundError
- Jar包冲突及java.lang.NoSuchMethodError异常解决方案
- Java 读取Excel2007 jar包冲突的问题(org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException)
- jar包冲突 java.lang.NoSuchMethodError: antlr.collecti
- maven java.lang.NoClassDefFoundError: Lorg/codehaus/plexus/archiver/jar/JarArchi
- jstl Maven 依赖导致的 Jar 包冲突
- maven项目由于多个依赖中含有同一个jar包导致的冲突问题的解决办法
- Jar包冲突及java.lang.NoSuchMethodError异常解决方案
- maven jar包冲突导致java mail报空指针异常问题的解决过程
- 由Maven管理jar文件找不到而引出的问题java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRunt
- jsp-api.jar文件 与tomcat中同名包冲突出现 java.lang.NullPointerException
- java.lang.IncompatibleClassChangeError:可以考虑是否是jar包冲突
- java.lang.NoSuchMethodError: 属于jar包冲突
- 【原】Maven解决jar冲突调试步骤:第三方组件引用不符合要求的javassit导致的相关异常
- zk的jar包冲突:java.lang.NoSuchMethodError: org.apache.zookeeper.ZooKeeper.getChildren(Ljava/lang/String;
- weblogic10.3.4与应用 jar包冲突 java.lang.NoSuchMethodError