maven里exclusion的应用,全网唯一准确概括

exclusion有两种情况:第一种是排除A依赖下的B依赖,第二种是A依赖版本使用1.0而不是2.0,实际都用一种方法解决,至于是在父类排除或是在自己项目里排除根据实际情况决定。

第一种:
假设您有一个 Java Web 应用程序,使用了 Spring Boot 框架。在构建过程中,您发现了以下依赖问题:

  1. 您的项目依赖了 Spring Boot 2.3.0 版本,而 Spring Boot 2.3.0 依赖了 Tomcat 9.0.35 版本。
  2. 但您的团队还有另一个项目依赖了 Tomcat 9.0.41 版本。这样就产生了 Tomcat 版本冲突。

您可以使用以下技巧来解决这个问题:

  1. 分析依赖树

    • 使用 Maven 的 dependency:tree 命令或 IntelliJ IDEA 的依赖分析工具,查看项目的依赖树结构。
    • 确认 Spring Boot 2.3.0 确实依赖了 Tomcat 9.0.35 版本。
  2. 有选择地排除依赖

    • 在您的项目的 pom.xml 文件中,找到 Spring Boot 2.3.0 的依赖声明。
    • 在该依赖中,添加 Exclusion 排除 Tomcat 9.0.35 版本:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.3.0.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  3. 明确指定所需的版本

    • 在您项目的 pom.xml 文件中,手动添加 Tomcat 9.0.41 版本的依赖:
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>9.0.41</version>
    </dependency>
    

这样做可以确保您的项目使用的是预期的 Tomcat 9.0.41 版本,而不会受到 Spring Boot 2.3.0 传递依赖的影响。

  1. 持续集成时进行依赖检查
    • 在您的持续集成环境中,可以配置依赖分析工具,如 Snyk 或 OWASP Dependency-Check,定期扫描项目的依赖状况。
    • 如果发现新的版本冲突,可以及时更新 Exclusion 规则。

第二种:**
假设您正在开发一个使用 Hibernate 的 Java 应用程序。在构建过程中,您发现了以下问题:

  1. 您的项目依赖了 Hibernate 5.4.12.Final 版本。
  2. 但您团队中另一个项目依赖了 Hibernate 5.3.7.Final 版本。
  3. 这样就导致了 Hibernate 版本冲突,可能会引发一些不兼容问题。

您可以采取以下步骤来解决这个问题:

  1. 分析依赖树

    • 使用 Maven 的 dependency:tree 命令或 IntelliJ IDEA 的依赖分析工具,查看项目的依赖树结构。
    • 确认您的项目确实依赖了 Hibernate 5.4.12.Final 版本。
  2. 有选择地排除依赖

    • 在您的项目的 pom.xml 文件中,找到 Hibernate 5.4.12.Final 的依赖声明。
    • 在该依赖中,添加 Exclusion 排除 Hibernate 5.3.7.Final 版本:
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.12.Final</version>
        <exclusions>
            <exclusion>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.3.7.Final</version>
            </exclusion>
        </exclusions>
    </dependency>
    

但是!
exclusion 元素中包含了 <version>5.3.7.Final</version> 标签。这种用法是不正确的。

正确的排除依赖项应该只包含 <groupId><artifactId>,不需要指定 <version> 标签。

如果您在 exclusion 中指定了 <version>,它会产生以下效果:

  1. 无效的排除规则: Maven 会忽略这个 exclusion 规则,因为它无法正确匹配到要排除的依赖项。

  2. 可能导致构建失败: 如果 Maven 在构建过程中遇到这样一个无效的排除规则,可能会抛出异常或报错,导致构建失败。

正确的 exclusion 应该如下所示:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.12.Final</version>
    <exclusions>
        <exclusion>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

这样可以正确地排除 org.hibernate:hibernate-core 依赖项,而不会指定具体的版本号。

总之,在编写 exclusion 规则时,请只包含 <groupId><artifactId>,不要添加 <version> 标签。这样可以确保 Maven 正确地处理依赖项排除,避免构建失败等问题。

排查方法

在处理依赖项冲突时,快速定位问题的根源是非常重要的。

  1. 使用依赖树分析

    • 如前所述,使用 mvn dependency:tree 命令可以查看项目的依赖树。
    • 仔细分析依赖树,寻找导致冲突的依赖项。这可以帮助您快速定位问题的根源。
  2. 利用依赖冲突报告

    • Maven 会在构建过程中生成依赖冲突报告,位于 target/dependency-reduced-pom.xml 文件中。
    • 仔细查看这个报告,它可以告诉您哪些依赖项之间存在冲突,以及 Maven 如何解决这些冲突。
  3. 使用 mvn dependency:analyze 命令

    • 这个命令可以分析项目的依赖关系,并报告任何未使用或缺失的依赖项。
    • 它还可以帮助您识别依赖项冲突,并提供一些建议来解决这些问题。
  4. 利用 IDE 的依赖分析工具

    • 许多 IDE 都内置了依赖分析工具,如 IntelliJ IDEA 的 Maven 依赖图和 Eclipse 的 Dependency Hierarchy 视图。
    • 这些工具可以直观地展示项目的依赖关系,并高亮显示冲突的依赖项。
  5. 检查依赖传递性

    • 有时,冲突可能源于间接依赖(传递依赖)。
    • 仔细检查您项目的传递依赖,看看是否有冲突的依赖项被拉入。
  6. 尝试 mvn dependency:resolve-plugins 命令

    • 这个命令可以帮助您解决与 Maven 插件相关的依赖冲突。
  7. 使用 Maven Enforcer 插件

    • 这个插件可以在构建过程中强制执行依赖项规则,比如版本范围限制。
    • 它可以帮助您提前发现并修复依赖项冲突问题。

通过利用这些工具和技术,您可以更快速地定位依赖项冲突的根源,并采取适当的措施来解决这些问题。

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值