jar包或者类冲突,一般日志中出现类似于:
java.lang.NoClassDefFoundError,java.lang.NoSuchMethodError,java.lang.NoSuchFieldError,java.lang.NoSuchMethodException,java.lang.LinkageError,java.lang.ClassNotFoundException
以下内容有兴趣可接着阅读,一般无需了解。
关于NoClassDefFoundError可以参考:https://stackoverflow.com/questions/7325579/java-lang-noclassdeffounderror-could-not-initialize-class-xxx
maven enforcer插件详细自定义配置说明:
首先在maven插件中添加enforcer插件:
代码块
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1-dp-SNAPSHOT</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>
</excludes>
<message>some dependency must exclude</message>
</bannedDependencies>
</rules>
</configuration>
</plugin>
然后输入maven命令来查找重复类和存在版本限制和冲突的jar包:
mvn -U clean -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插件参考文档:
https://www.cnblogs.com/f-zhao/p/6961058.html
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