maven解决项目冲突——使用mvn dependency:tree查看依赖树

maven解决项目冲突

在开发我们都会用maven来管理项目jar包,非常方便。但是,有时候会出现jar冲突的情况,导致项目起不来,这个时候我们就得去排查哪些jar包冲突了。

在jar冲突的时候,会报java.lang.SecurityException: class "xxxxxxx"'s signer information does not match signer information of other classes in the same package的错误

比如说:

Thread[main,5,main] exit with uncaught error java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package
java.lang.SecurityException: class "javax.servlet.FilterRegistration"'s signer information does not match signer information of other classes in the same package
        at java.lang.ClassLoader.checkCerts(ClassLoader.java:895)
        at java.lang.ClassLoader.preDefineClass(ClassLoader.java:665)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:758)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

signer information does not match signer information of other classes in the same package说明了不同版本jar包中有相同类,并且类实现有冲突,无法兼容。

可以在idea中通过快捷键ctrl+N查看冲突的类,如果起冲突的话,肯定会有复数相同名字的类,查看这些类分别属于哪些jar包,用于后面排查。

解决jar包冲突,首先一定会去查看pom文件,看看有没有重复导入版本冲突的依赖。很多时候,虽然pom没问题,没有冲突,但是由于有一些依赖间接引用了其它版本的相关依赖,这也会导致jar出现冲突。

我们可以通过查询maven的依赖树来查看具体冲突的jar包,如果配置了maven环境变量的话,在终端中输入mvn dependency:tree,如果没有配置环境变量,可以在idea的maven命令行窗口输入。

如果servlet的jar包冲突了,就用ctrl+f查询有哪些依赖间接引用了servlet依赖

下面是资产树的输出例子:

[INFO] +- org.apache.httpcomponents:httpclient:jar:4.2.3:compile
[INFO] +- org.apache.httpcomponents:httpcore:jar:4.2.1:compile
[INFO] +- org.eclipse.jetty.aggregate:jetty-all-server:jar:8.1.15.v20140411:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.security.auth.message:jar:1.0.0.v201108011116:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.mail.glassfish:jar:1.4.1.v201005082020:compile
[INFO] |  +- org.eclipse.jetty.orbit:javax.activation:jar:1.1.0.v201105071233:compile
[INFO] |  \- org.eclipse.jetty.orbit:javax.annotation:jar:1.1.0.v201108011116:compile
[INFO] +- com.jcraft:jsch:jar:0.1.44:compile

使用mvn dependency:tree > x.txt命令可以将依赖树输出到文本中,更容易进行分析

依赖树中最外层根代表父依赖,父依赖下面每一个+-号代表这个父依赖的子依赖,\-符号代表同辈分依赖中的最后一个,可以简单理解为同一组依赖中的最后一个依赖,作为一个分界线。

以上面的例子为例,在依赖中查看哪些依赖间接引用了冲突的依赖,比如说hadoop-common引用了servlet依赖,版本和我们自己导入的servlet依赖冲突了,那么为了解决冲突,我们需要把hadoop-common依赖的子依赖排除掉。

<dependency>  
<groupId>org.apache.hadoop</groupId>  
<artifactId>hadoop-common</artifactId>  
<exclusions>  
<exclusion>  
  <groupId>javax.servlet</groupId>  
  <artifactId>*</artifactId>  
</exclusion>  
</exclusions>  
</dependency>

可以通过exclusion标签将子依赖排除掉。排除掉所有冲突的子依赖之后,刷新一下maven,然后重新编译项目,检查idea项目的Libraries目录下是否还有冲突依赖,如果没有的话,那么项目应该可成功运行了。

posted @ 2021-12-23 15:33  TidalCoast  阅读(1745)  评论(0编辑  收藏  举报