1、诊断包冲突
java.lang.NoSuchMethodError: org.apache.commons.io.output.DeferredFileOutputStream.<init>(ILjava/lang/String;Ljava/lang/String;Ljava/io/File;)V
2、解决
2.1 可见的依赖冲突
在eclipse中打开工程,在pom文件的dependency hierarchy中,搜冲突的包commons-io,查看各依赖包的依赖信息。包有依赖冲突的话,会有显示xxx版本与xxx版本冲突。选择正确的版本,将剩下的版本在对应的引用包下exclusion掉。
或者用 mvn dependency:tree > tree.log,将依赖信息导入文件tree.log中,查看包commons-io的依赖信息。
2.2 不可见的依赖冲突
1)查看服务器使用的jboss路径下有没有包含冲突的包的其他版本。
路径是:jboss-x.x.x.GA/lib, 和 jboss-x.x.x.GA/server/default/lib ,如果里面有冲突的版本,则删除。
2)查看异常发生时,JVM加载的是哪个包。
在程序启动的脚本中加入JVM启动参数 -verbose:class,然后重启应用。在启动日志中可以看到加载的类来自哪个包。
[Loaded org.apache.velocity.runtime.parser.node.ASTTrue from file:/home/admin/app/.default/deploy/app.war/WEB-INF/lib/velocity-1.6.4.jar]
触发引起异常的操作,查看加载的类所在的包,与正确的包比较。
补充:
出现这种情况,有可能是包的版本引发的错误,所调用的方法在高版本和低版本的实现不一样,或者在某一版本中,方法有缺失。
也有可能是,两个不同的jar包,里面含有相同路径的类,然后在调用过程中混淆了。这种情况,可以在eclipse中使用shift+ctrl+T,查看工程中有多少个这样的类,查看类路径信息。