通过enforcer插件定位jar包或类冲突问题

jar包或者类冲突,一般日志中出现类似于: 

java.lang.NoClassDefFoundError,java.lang.NoSuchMethodError,java.lang.NoSuchFieldError,java.lang.NoSuchMethodException,java.lang.LinkageError,java.lang.ClassNotFoundException

 

首先在maven插件中添加enforcer插件:

< plugin >
     < groupId >org.apache.maven.plugins</ groupId >
     < artifactId >maven-enforcer-plugin</ artifactId >
     < version >1.4.1</ version >
     < executions >
         < execution >
             < id >default-cli</ id >
             < phase >validate</ phase >
             < goals >
                 < goal >enforce</ goal >
             </ goals >
         </ execution >
     </ executions >
     < dependencies >
         < dependency >
             < groupId >org.codehaus.mojo</ groupId >
             < artifactId >extra-enforcer-rules</ artifactId >
             < version >1.0-beta-4</ version >
         </ dependency >
     </ dependencies >
     < configuration >
         <!--规则检查不通过就构建失败;Default:false. -->
         <!--<failFast>true</failFast>-->
         < rules >
             <!--<requireMavenVersion>
                 <version>3.0.4</version>
             </requireMavenVersion>-->
             < requireJavaVersion >
                 < version >1.6.0</ version >
             </ requireJavaVersion >
             < banDuplicateClasses >
                 < ignoreClasses >
                     < ignoreClass >javax.*</ ignoreClass >
                     < ignoreClass >org.junit.*</ ignoreClass >
                     < ignoreClass >junit.*</ ignoreClass >
                     < ignoreClass >org.apache.xbean.recipe.*</ ignoreClass >
                     < ignoreClass >org.hamcrest.*</ ignoreClass >
                     < ignoreClass >org.slf4j.*</ ignoreClass >
                     < ignoreClass >org.antlr.runtime.*</ ignoreClass >
                     < ignoreClass >org.apache.commons.lang.*</ ignoreClass >
                     < ignoreClass >org.apache.commons.codec.*</ ignoreClass >
                     < ignoreClass >org.apache.commons.logging.*</ ignoreClass >
                     < ignoreClass >org.codehaus.plexus.component.builder.*</ ignoreClass >
                 </ ignoreClasses >
                 < findAllDuplicates >true</ findAllDuplicates >
             </ banDuplicateClasses >
             < bannedDependencies >
                 <!--是否检查传递性依赖(间接依赖)-->
                 < searchTransitive >true</ searchTransitive >
                 < excludes >
                     < exclude >org.apache:libthrift</ exclude >
                     < exclude >org.jboss.netty:netty</ exclude >
                     < exclude >org.apache.thrift:libthrift:(,0.8.0),(0.8.0,)</ exclude >
                     < exclude >io.netty:netty:(,3.9.2.Final)</ exclude >
                     < exclude >com.sankuai.octo:mns-invoker:(,1.7.5)</ exclude >
                     < exclude >com.fasterxml.jackson.core:*:(,2.6.0)</ exclude >
                     < exclude >com.google.guava:guava:(,15.0)</ exclude >
                     < exclude >com.caucho:hessian:(,3.1.5),(3.1.5,)</ exclude >
                     < exclude >com.dianping.dpsf:dpsf-net:(,2.9.7)</ exclude >
                     < exclude >com.dianping:pigeon-octo:(,0.1.1)</ exclude >
                     < exclude >com.dianping.platform:platform-sdk:(,1.3.5)</ exclude >
                     < exclude >com.dianping.lion:lion-client:(,0.6.7)</ exclude >
                     < exclude >com.dianping.cat:*:(,1.5.4)</ exclude >
                     < exclude >com.dianping.swallow:swallow-producerclient:(,0.8.7)</ exclude >
                     < exclude >com.dianping.swallow:swallow-consumerclient:(,0.8.7)</ exclude >
                     < exclude >com.dianping.swallow:swallow-common:(,0.8.7)</ exclude >
                     < exclude >com.dianping.swallow:swallow-client:(,0.5.4)</ exclude >
                 </ excludes >
                 < message >some dependency must exclude</ message >
             </ bannedDependencies >
         </ rules >
     </ configuration >
</ plugin >

 

然后输入maven命令来查找重复类和存在版本限制和冲突的jar包:

mvn -U clean package -Dmaven.test.skip=true enforcer:enforce -DcheckDeployRelease_skip=true


会看到相关的输出,一个个排查即可:

存在重复的类的情况:

Found in:
     org.jboss.netty:netty:jar: 3.2 . 19 :compile
     io.netty:netty:jar: 3.9 . 2 .Final:compile
   Duplicate classes:
     org/jboss/netty/handler/codec/base64/Base64Decoder. class
     org/jboss/netty/util/VirtualExecutorService. class
以下省略


不允许的依赖jar包或不允许的依赖版本号:

[WARNING] Rule  2 : org.apache.maven.plugins.enforcer.BannedDependencies failed with message:
some dependency must exclude
Found Banned Dependency: org.apache:libthrift:jar: 0.6 . 0
Found Banned Dependency: org.jboss.netty:netty:jar: 3.2 . 19
Found Banned Dependency: org.apache.thrift:libthrift:jar: 0.9 . 3
Use  'mvn dependency:tree'  to locate the source of the banned dependencies.


最后根据插件排查下来的信息,一个个排除掉存在冲突的jar包即可。注意如果是parent pom当中的依赖冲突,要在parent pom中修改,否则无法排除。

福利:使用idea的同学,推荐使用maven helper插件排除冲突,一目了然,很好用。


enforcer插件参考文档:

http://www.tuicool.com/articles/RfIBfa

https://github.com/dimitri-koussa/maven-enforcer-duplicate-class-check

http://www.mojohaus.org/extra-enforcer-rules/banDuplicateClasses.html 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值