mvn依赖树排除包冲突

在工作中经常碰到jar冲突的问题,有些jar并没有在pom.xml配置,但由于与某些jar存在依赖关系所以被引入项目中,有时候这些被引入的jar并非你所需要,而且和你pom.xml配置的dependency冲突,这时候就需要将这些冲突的jar排除出去,具体办法如下

在项目的更目录下执行如下命令:

mvn dependency:tree

输出如下:

[INFO] ------------------------------------------------------------------------
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ sparklearn ---
[INFO] +- org.apache.spark:spark-hive_2.10:jar:1.6.1-mdh1.6.1.2:compile
[INFO] |  +- com.twitter:parquet-hadoop-bundle:jar:1.6.0:compile
[INFO] |  +- org.spark-project.hive:hive-cli:jar:1.2.1.spark:compile
[INFO] |  |  \- jline:jline:jar:2.12:compile
[INFO] |  +- org.spark-project.hive:hive-exec:jar:1.2.1.spark:compile
[INFO] |  |  +- javolution:javolution:jar:5.5.1:compile
[INFO] |  |  +- log4j:apache-log4j-extras:jar:1.2.17:compile
[INFO] |  |  +- org.antlr:antlr-runtime:jar:3.4:compile
[INFO] |  |  |  +- org.antlr:stringtemplate:jar:3.2.1:compile
[INFO] |  |  |  \- antlr:antlr:jar:2.7.7:compile
[INFO] |  |  +- org.antlr:ST4:jar:4.0.4:compile
[INFO] |  |  +- org.apache.commons:commons-compress:jar:1.4.1:compile
[INFO] |  |  |  \- org.tukaani:xz:jar:1.0:compile
[INFO] |  |  +- org.codehaus.groovy:groovy-all:jar:2.1.6:compile
[INFO] |  |  +- com.googlecode.javaewah:JavaEWAH:jar:0.3.2:compile
[INFO] |  |  +- org.iq80.snappy:snappy:jar:0.2:compile
[INFO] |  |  +- stax:stax-api:jar:1.0.1:compile
[INFO] |  |  \- net.sf.opencsv:opencsv:jar:2.3:compile
[INFO] |  +- org.spark-project.hive:hive-metastore:jar:1.2.1.spark:compile
[INFO] |  |  +- com.jolbox:bonecp:jar:0.8.0.RELEASE:compile
[INFO] |  |  +- org.apache.derby:derby:jar:10.10.2.0:compile
[INFO] |  |  +- org.datanucleus:datanucleus-api-jdo:jar:3.2.6:compile
[INFO] |  |  +- org.datanucleus:datanucleus-rdbms:jar:3.2.9:compile
[INFO] |  |  +- commons-dbcp:commons-dbcp:jar:1.4:compile
[INFO] |  |  \- javax.jdo:jdo-api:jar:3.0.1:compile
[INFO] |  |     \- javax.transaction:jta:jar:1.1:compile
[INFO] |  +- org.apache.avro:avro:jar:1.7.7:compile
[INFO] |  +- org.apache.calcite:calcite-avatica:jar:1.2.0-incubating:compile
[INFO] |  +- org.apache.calcite:calcite-core:jar:1.2.0-incubating:compile
[INFO] |  |  +- org.apache.calcite:calcite-linq4j:jar:1.2.0-incubating:compile
[INFO] |  |  +- net.hydromatic:eigenbase-properties:jar:1.1.5:compile
[INFO] |  |  \- org.codehaus.janino:commons-compiler:jar:2.7.6:compile
[INFO] |  +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.13:compile
[INFO] |  +- commons-codec:commons-codec:jar:1.10:compile
[INFO] |  +- joda-time:joda-time:jar:2.9:compile
[INFO] |  +- org.jodd:jodd-core:jar:3.5.2:compile
[INFO] |  +- org.datanucleus:datanucleus-core:jar:3.2.10:compile
[INFO] |  +- org.apache.thrift:libthrift:jar:0.9.2:compile
[INFO] |  \- org.apache.thrift:libfb303:jar:0.9.2:compile
[INFO] +- org.apache.hive:hive-jdbc:jar:0.13.1-cdh5.3.0:compile
[INFO] |  +- org.apache.hive:hive-common:jar:0.13.1-cdh5.3.0:compile
[INFO] |  |  \- org.apache.hive:hive-shims:jar:0.13.1-cdh5.3.0:compile
[INFO] |  |     +- org.apache.hive.shims:hive-shims-common:jar:0.13.1-cdh5.3.0:compile
[INFO] |  |     +- org.apache.hive.shims:hive-shims-common-secure:jar:0.13.1-cdh5.3.0:compile
[INFO] |  |     +- org.apache.hive.shims:hive-shims-0.23:jar:0.13.1-cdh5.3.0:runtime
[INFO] |  |     \- org.apache.hive.shims:hive-shims-scheduler:jar:0.13.1-cdh5.3.0:runtime
[INFO] |  +- org.apache.hive:hive-metastore:jar:0.13.1-cdh5.3.0:compile
[INFO] |  +- org.apache.hive:hive-serde:jar:0.13.1-cdh5.3.0:compile
[INFO] |  |  \- com.sun.jersey:jersey-servlet:jar:1.14:compile
[INFO] |  +- org.apache.hive:hive-service:jar:0.13.1-cdh5.3.0:compile
[INFO] |  |  +- net.sf.jpam:jpam:jar:1.1:compile
[INFO] |  |  \- org.eclipse.jetty.aggregate:jetty-all:jar:7.6.0.v20120127:compile
[INFO] |  |     +- org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1:compile
[INFO] |  |     +- org.apache.geronimo.specs:geronimo-jaspic_1.0_spec:jar:1.0:compile
[INFO] |  |     +- org.apache.geronimo.specs:geronimo-annotation_1.0_spec:jar:1.1.1:compile
[INFO] |  |     \- asm:asm-commons:jar:3.1:compile
[INFO] |  |        \- asm:asm-tree:jar:3.1:compile
[INFO] |  \- org.apache.hive:hive-exec:jar:0.13.1-cdh5.3.0:compile
[INFO] |     +- org.apache.hive:hive-ant:jar:0.13.1-cdh5.3.0:compile
[INFO] |     |  \- org.apache.velocity:velocity:jar:1.5:compile
[INFO] |     \- org.apache.ant:ant:jar:1.9.1:compile
[INFO] |        \- org.apache.ant:ant-launcher:jar:1.9.1:compile
[INFO] +- org.mi:thrift:jar:0.9.2-mi-v1.1:compile
[INFO] |  \- org.json:json:jar:20140107:compile
[INFO] +- redis.clients:jedis:jar:2.9.0:compile
[INFO] |  \- org.apache.commons:commons-pool2:jar:2.4.2:compile
[INFO] +- net.sf.json-lib:json-lib:jar:2.4:compile
[INFO] +- net.sf.ezmorph:ezmorph:jar:1.0.6:compile
[INFO] +- org.apache.orc:orc-core:jar:1.2.3:compile
[INFO] |  +- io.airlift:aircompressor:jar:0.3:compile
[INFO] |  \- org.apache.hive:hive-storage-api:jar:2.1.1.3-pre-orc:compile
[INFO] +- org.apache.kafka:kafka_2.9.2:jar:0.8.1.1:compile
[INFO] |  +- com.yammer.metrics:metrics-core:jar:2.2.0:compile
[INFO] |  +- org.apache.zookeeper:zookeeper:jar:3.3.4:compile
[INFO] |  +- net.sf.jopt-simple:jopt-simple:jar:3.2:compile
[INFO] |  \- com.101tec:zkclient:jar:0.3:compile
[INFO] +- com.google.code.gson:gson:jar:2.8.0:compile
[INFO] +- com.mi.bigdata:presto-jdbc:jar:1.0-SNAPSHOT:compile
[INFO] |  +- commons-io:commons-io:jar:2.5:compile
[INFO] |  \- com.mi.bigdata:common-utils:jar:1.0-SNAPSHOT:compile
[INFO] +- commons-collections:commons-collections:jar:3.2.2:compile
[INFO] +- commons-httpclient:commons-httpclient:jar:3.1:compile
[INFO] +- commons-pool:commons-pool:jar:1.6:compile
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.2:compile
[INFO] +- org.apache.httpcomponents:httpcore:jar:4.4.5:compile
[INFO] +- com.xiaomi.data:data-platform-spec-b2c:jar:0.0.1-SNAPSHOT:compile
[INFO] |  \- org.apache.thrift:thrift:jar:0.5.0-fix-thrift2402:compile
[INFO] +- org.apache.hadoop:hadoop-hdfs:jar:2.6.0-mdh3.4.2:compile
[INFO] |  +- org.mortbay.jetty:jetty:jar:6.1.26:compile
[INFO] |  +- org.mortbay.jetty:jetty-util:jar:6.1.26:compile
[INFO] |  +- commons-daemon:commons-daemon:jar:1.0.13:compile
[INFO] |  +- javax.servlet.jsp:jsp-api:jar:2.1:compile
[INFO] |  +- com.xiaomi.infra:ext-log4j:jar:1.0.0-SNAPSHOT:compile
[INFO] |  +- javax.servlet:servlet-api:jar:2.5:compile
[INFO] |  +- org.codehaus.jackson:jackson-core-asl:jar:1.9.13:compile
[INFO] |  +- tomcat:jasper-runtime:jar:5.5.23:compile
[INFO] |  |  \- commons-el:commons-el:jar:1.0:compile
[INFO] |  +- xmlenc:xmlenc:jar:0.52:compile
[INFO] |  +- xerces:xercesImpl:jar:2.9.1:compile
[INFO] |  |  \- xml-apis:xml-apis:jar:1.3.04:compile
[INFO] |  \- org.htrace:htrace-core:jar:3.0.4:compile

[INFO] ------------------------------------------------------------------------

比如我想配置

<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>2.1.1</version>
</dependency>

但是项目中有两处都依赖引入这个jar,但是这些jar不是我们所需要的,而且冲突,此时找到hive-exec

|  +- org.spark-project.hive:hive-exec:jar:1.2.1.spark:compile
|  \- org.apache.hive:hive-exec:jar:0.13.1-cdh5.3.0:compile

他们的父节点分别是:

+- org.apache.spark:spark-hive_2.10:jar:1.6.1-mdh1.6.1.2:compile

+- org.apache.hive:hive-jdbc:jar:0.13.1-cdh5.3.0:compile

在pom.xml如下配置,就可以将这两个jar排除

<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_2.10</artifactId>
            <version>${spark.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.spark-project.hive</groupId>
                    <artifactId>hive-exec</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

<dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>0.13.1-cdh5.3.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.hive</groupId>
                    <artifactId>hive-exec</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
<think>好的,用户之前问了关于Lombok在IDEA中配置的问题,现在又想知道如何使用依赖树检查依赖冲突。我需要一步步分析他的需求。 首先,用户可能是在Java项目中遇到了依赖冲突的问题,比如类找不到或者方法冲突。之前的问题涉及到Lombok,所以现在他可能在解决依赖问题时遇到了困难,需要检查依赖树。 接下来,用户可能使用的是Maven或者Gradle,因为这两个是Java主要的构建工具。我需要分别介绍这两种工具如何生成依赖树,并检查冲突。 对于Maven,常用的命令是mvn dependency:tree,但用户可能不知道如何过滤输出或者保存到文件。需要详细说明参数的使用,比如-Dincludes来过滤特定groupId,或者输出到文件方便查看。 对于Gradle,用户可能不太熟悉如何生成依赖树,尤其是新版本的Gradle可能需要不同的命令。需要给出具体的命令,比如gradle dependencies,并说明如何找到冲突的部分,比如查看runtimeClasspath或者compileClasspath。 另外,用户可能不知道依赖冲突的常见表现,比如多个版本存在时的提示,或者在构建日志中的错误信息。需要指出这些关键点,帮助用户识别冲突。 还有,用户可能需要使用图形化工具,比如IDEA的插件或者Maven Helper,这样更方便可视化分析依赖树。需要推荐这些工具,并说明如何安装和使用。 最后,用户可能想知道解决冲突的方法,比如排除依赖或者强制指定版本。虽然用户的问题是检查冲突,但提供解决方法的简要步骤也是有帮助的。 总结来说,我需要分步骤详细说明Maven和Gradle检查依赖冲突的方法,包括命令行和图形化工具,同时指出依赖冲突的常见表现和解决方法,确保用户能够全面理解和操作。</think> Java 项目中,**依赖冲突**通常表现为以下现象: - 运行时抛出 `ClassNotFoundException` 或 `NoSuchMethodError`; - 编译时提示版本不兼容(如 `java.lang.UnsupportedClassVersionError`); - 日志中警告存在多个版本的依赖(如 `There are multiple versions of xxx in the classpath`)。 通过分析**依赖树**,可以快速定位冲突的依赖项。以下是具体操作步骤: --- ### **1. Maven 项目:使用 `mvn dependency:tree`** #### **基础命令** ```bash # 生成完整的依赖树(控制台输出) mvn dependency:tree # 将依赖树输出到文件(方便搜索) mvn dependency:tree > dependency-tree.txt ``` #### **过滤特定依赖** 通过 `-Dincludes` 参数筛选目标依赖(支持通配符 `*`): ```bash # 查找所有与 `spring-core` 相关的依赖 mvn dependency:tree -Dincludes=org.springframework:spring-core # 查找某个 groupId 下的所有依赖(例如 com.google.guava) mvn dependency:tree -Dincludes=com.google.guava:* ``` #### **解读依赖树** - **树形结构**:依赖层级关系,子依赖是父依赖的传递性依赖。 - **冲突标记**:若同一依赖出现多个版本,Maven 默认选择 **最近定义** 的版本(根据依赖顺序),其他版本会被忽略。 - **冲突示例**: ``` [INFO] +- com.example:libA:1.0 [INFO] | \- org.apache.commons:commons-lang3:3.10 [INFO] \- com.example:libB:2.0 [INFO] \- org.apache.commons:commons-lang3:3.12 ``` 此处 `commons-lang3` 存在两个版本,最终会使用 `3.12`。 --- ### **2. Gradle 项目:使用 `gradle dependencies`** #### **基础命令** ```bash # 生成依赖报告(按配置范围分类) gradle dependencies # 生成指定配置范围的依赖树(如 `implementation`、`runtimeClasspath`) gradle dependencies --configuration runtimeClasspath ``` #### **过滤输出结果** Gradle 默认输出较复杂,可通过以下方式简化: 1. 在 `build.gradle` 中添加过滤规则: ```groovy tasks.named('dependencies') { it.doLast { println("=== 依赖树精简版 ===") configurations.runtimeClasspath.resolvedConfiguration.firstLevelModuleDependencies.each { dep -> println("${dep.moduleGroup}:${dep.moduleName}:${dep.moduleVersion}") dep.allModuleArtifacts.each { artifact -> println(" -> ${artifact.name}:${artifact.version}") } } } } ``` 2. 运行命令后直接搜索冲突版本(如 `Ctrl+F` 查找 `commons-lang3`)。 --- ### **3. IDEA 可视化工具** #### **方法一:内置依赖分析** 1. 打开 `pom.xml` 或 `build.gradle` 文件。 2. 右键点击文件内容,选择 **Maven/Gradle → Show Dependencies**。 3. IDEA 会生成交互式依赖图: - **红色波浪线**:直接标记冲突的依赖。 - **右键依赖项** → **Exclude** 可直接排除冲突版本。 #### **方法二:安装插件** - **Maven Helper**(针对 Maven): 1. 安装插件:`File → Settings → Plugins → 搜索 "Maven Helper"`。 2. 打开 `pom.xml`,点击底部 **Dependency Analyzer** 标签: - **Conflicts** 标签页直接列出所有冲突依赖。 - 右键冲突项选择 **Exclude** 快速排除--- ### **4. 冲突的典型表现** 在依赖树中重点关注以下模式: 1. **同一依赖多个版本**: ``` com.google.guava:guava:30.0-jre (冲突) com.google.guava:guava:25.0-jre ``` 2. **依赖传递路径不同**: ``` +- libA → libX → libY:1.0 \- libB → libY:2.0 ``` --- ### **5. 解决依赖冲突** 1. **排除传递性依赖**(以 Maven 为例): ```xml <dependency> <groupId>com.example</groupId> <artifactId>problematic-lib</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>冲突的 groupId</groupId> <artifactId>冲突的 artifactId</artifactId> </exclusion> </exclusions> </dependency> ``` 2. **强制指定版本**(Maven): ```xml <properties> <commons-lang3.version>3.12</commons-lang3.version> </properties> ``` 3. **Gradle 强制版本**: ```groovy configurations.all { resolutionStrategy.force 'org.apache.commons:commons-lang3:3.12' } ``` --- 通过依赖树分析,可精准定位冲突源头,避免盲目排除依赖!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值