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