java.lang.NoClassDefFoundError,java.lang.NoSuchMethodError,java.lang.NoSuchFieldError,java.lang.NoSuchMethodException,java.lang.LinkageError,java.lang.ClassNotFoundExceptionhtml
关于NoClassDefFoundError能够参考:https://stackoverflow.com/questions/7325579/java-lang-noclassdeffounderror-could-not-initialize-class-xxxjava
首先在maven插件中添加enforcer插件:git
代码块github
<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包:apache
mvn -U clean -Dmaven.test.skip=true enforcer:enforce -DcheckDeployRelease_skip=truemaven
会看到相关的输出,一个个排查便可:ide
存在重复的类的状况:ui
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包或不容许的依赖版本号:google
[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
福利:使用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