maven 依赖树查看以及冲突解决

语言: CN / TW / HK

maven 依赖树查看以及冲突解决

1. 查看依赖树

如果你使用idea可以点击上图按钮,会有一个弹出框,选择一个项目工程,使用命令:

mvn dependency:tree


[INFO] +- org.springframework:spring-webmvc:jar:4.2.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:4.2.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:4.2.2.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-aop:jar:4.2.2.RELEASE:compile
[INFO] |  |     \- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  +- org.springframework:spring-core:jar:4.2.2.RELEASE:compile
[INFO] |  |  \- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  +- org.springframework:spring-expression:jar:4.2.2.RELEASE:compile

会出现类似的依赖结构。上面就是一个依赖树结构,并有层级关系,我们可以看出他们的依赖父子关系。

** 其中+-\- 并无实际含义,只是方便展示查看。 **

2. 依赖树查看扩展命令

1. -Dverbose

verbose 的中文翻译为冗余的意思,这个命令就是查看更加具体和冗余的依赖树信息。 使用示例:

dependency:tree -Dverbose=true

2. -Dincludes

这个参数就是查看你感兴趣的依赖,支持正则表示式。如我只想查看hadoop相关的依赖,示例:

dependency:tree -Dincludes=*hadoop*

输出:


com.mytest.server:mytest-server:jar:1.0-SNAPSHOT
+- org.apache.hive:hive-jdbc:jar:3.1.2:compile
|  \- org.apache.hive:hive-shims:jar:3.1.2:compile
|     \- org.apache.hive.shims:hive-shims-0.23:jar:3.1.2:runtime
|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:3.1.0:runtime
|           +- org.apache.hadoop:hadoop-yarn-server-common:jar:3.1.0:compile
|           +- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:3.1.0:runtime
|           \- org.apache.hadoop:hadoop-yarn-server-web-proxy:jar:3.1.0:runtime
+- org.apache.hadoop:hadoop-common:jar:3.1.2:compile
|  +- org.apache.hadoop:hadoop-annotations:jar:3.1.2:compile
|  \- org.apache.hadoop:hadoop-auth:jar:3.1.2:compile
+- org.apache.hive:hive-exec:jar:3.1.2:compile
|  \- org.apache.hadoop:hadoop-yarn-registry:jar:3.1.0:compile
|     +- org.apache.hadoop:hadoop-yarn-api:jar:3.1.0:compile
|     \- org.apache.hadoop:hadoop-yarn-common:jar:3.1.0:compile
+- org.apache.hbase:hbase-common:jar:1.1.2:compile
|  \- org.apache.hadoop:hadoop-mapreduce-client-core:jar:2.5.1:compile
\- org.apache.hbase:hbase-server:jar:1.1.2:compile
   +- org.apache.hadoop:hadoop-client:jar:2.5.1:compile
   |  +- org.apache.hadoop:hadoop-mapreduce-client-app:jar:2.5.1:compile
   |  |  +- org.apache.hadoop:hadoop-mapreduce-client-common:jar:2.5.1:compile
   |  |  |  \- org.apache.hadoop:hadoop-yarn-client:jar:2.5.1:compile
   |  |  \- org.apache.hadoop:hadoop-mapreduce-client-shuffle:jar:2.5.1:compile
   |  \- org.apache.hadoop:hadoop-mapreduce-client-jobclient:jar:2.5.1:compile
   \- org.apache.hadoop:hadoop-hdfs:jar:2.5.1:compile

3. -DoutputFile

默认的依赖树输出是到控制台的,你可以重定向到一个你指定的文件。如:

dependency:tree -Dincludes=*hadoop* -DoutputFile=你指定的文件

这样方便后续查看。

3. 冲突解决

以解决guava为例,查看命令可以使用-Dverbose,你可以看到多个guava版本,有很多还有提示冲突了(com.google.guava:guava:jar:16.0.1:runtime - omitted for conflict with 11.0.2)

你可以手动解决冲突,引入适配版本,然后依赖包中依赖了guava包的使用 exclusion进行排除,如:


    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-common</artifactId>
        <version>1.1.2</version>
        <exclusions>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion> 
    </dependency>
        

4. shade解决冲突

但是还有时候你会遇到更糟糕的情况,不同包依赖的包互相冲突,并且这个冲突包的两个版本不可兼容,如guava。如我遇到的org.apache.hbase和spring的依赖guava冲突,但是他们依赖不同版本guava,不可替换,此时好的办法就是使用shade版本,如:


<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-shaded-client -->
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-shaded-client</artifactId>
            <version>2.4.1</version>
        </dependency>
        

这个shade包可以去maven官网下载,通常官方打的依赖包还是可靠的。 shade原理: 为什么用shade版本就可以了?其实很简单,就是修改其中任意一方的依赖路径来解决的,其实就是package值。如Gson类的package正常值是package com.google.gson;,在hbase-shaded-client中就是package org.apache.hbase.thirdparty.com.google.gson;,如果package不同,自然不会有冲突了。

5. 参考

  1. https://blog.csdn.net/u010003835/article/details/81633093
  2. https://stackoverflow.com/questions/34006740/what-is-the-difference-between-and-in-maven-dependency-tree-output
  3. https://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html
分享到: