NoSuchMethodError,解决jar包冲突

现象

     开发机,daily环境web应用均测试通过,预发布环境出现检查应用失败,查看日志出现NoSuchMethodError


异常: 当看到异常信息里有NoSuchMethodError时,你应该很高兴,因为这种错误一般是因为jar包冲突引起的。例如异常信息

Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;II)V


解决方法

     排除jar包依赖


步骤

第一步:查看应用最终打成的war包里依赖了哪几个跟netty相关的jar包,执行命令 ls  |grep *netty* 得到

    jboss.jboss-netty-3.2.5.Final.jar
    netty-3.2.1.Final.jar
    netty-3.6.3.Final.jar

  这说明有三个netty相关的jar


第二步:是哪些jar包引入上面三个跟netty相关的jar的?

  利用maven dependency:tree插件分析,执行 maven dependency:tree>dependency.log里,vim dependency.log得到 
  org.jboss.netty:netty:jar:3.2.1.Final:compile
  io.netty:netty:jar:3.6.3.Final:compile
  com.alibaba.external:jboss.jboss-netty:jar:3.2.5.Final:compile


第三步:排除依赖

按照maven dependency:tree里计算出来的maven坐标exclue掉低版本,保留高版本,因此排除掉下面两个jar包

  <exclusion>
<groupId>com.alibaba.external</groupId>
<artifactId>jboss.jboss-netty</artifactId>
</exclusion>
   <exclusion>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</exclusion>

 注意: 虽然第二步结果中,三个jar包名字<groupId><artifactId>不同,但类的全路径org.jboss.netty.channel.socket.nio.NioClientSocketChannel是一样的。 

 例如Company1.Unit1.Project1:App1:jar, Company2.Unit2.Project2:App2:jar , 它们依赖了同一个类org.jboss.netty.channel.socket.nio.NioClientSocketChannel,

 而这两个所在的jar包版本不一致。


由于 jar包的加载是随机的,如果加载了低版本就会出现异常NoSuchMethodError。这也是为什么在开发机和daily环境都可以启动,但预发布失败的原因。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值