gpt4 book ai didi

java - 如何在多 pom Maven 项目中固定传递依赖版本

转载 作者:行者123 更新时间:2023-12-03 23:17:49 25 4
gpt4 key购买 nike

我正在开发一个大型 Java 代码库,该代码库被拆分为多个模块,每个模块都有一个单独的 pom.xml,所有这些都由顶级 pom.xml 提供。

我目前正在引入几个库依赖项。依赖的传递集很大,幸运的是,不同模块的依赖版本存在冲突。

这是我的情况的简化:

project/pom.xml
/module-a/pom.xml # references library-a, depends on library-c:v1
/module-b/pom.xml # references library-b, depends on library-c:v2
/module-c/pom.xml # references module-a and module-b

现在单元测试 module-a会锻炼 library-alibrary-c:v1 面前, 而 module-b会锻炼 library-blibrary-c:v2 面前.

问题是 module-amodule-b module-c 时需要一起生活在同一个类路径上已部署,但 library-c 的任何版本在 module-c 时选择已打包,至少有一个库组合未经单元测试!

我想固定 library-c 的版本以某种方式在父 pom 级别,而不是在每个传递依赖 library-c 的模块中重复我自己;理想情况下,它会以这样的方式添加,表明它是一个传递依赖,如果 library-a 允许消失。和 library-b不再依赖它。

我想保证只有一个版本可供选择
整个项目的每个传递依赖都源于这个父 pom,如果这不是真的,我希望构建爆炸。我写了一个工具来解析 mvn dependency:tree 的输出(将树的叶子变成从叶子到根的路径森林,然后使用依赖路径找到所有不同版本的叶子)所以我可以看到问题,但没有明确解决每个冲突的传递依赖关系和膨胀的 pom有了多余的声明,这似乎没有什么成果。如果我别无选择,我自然会这样做。

用 Maven 处理这种传递依赖冲突问题的最佳方法是什么?

这个问题有多严重?除了无法令人信服的测试覆盖率之外,在实践中我看到 JVM-killing NoSuchMethodError在运行时从错误的版本开始部署。我希望至少在测试时看到这些。

最佳答案

看起来这有两个方面:

  1. You need to insist on a single version of a dependency, whether it is declared explicitly or acquired transitively


您可以使用 <dependencyManagement/> 这里。例如,在顶级 pom.xml 中,您可以固定 library-c 的版本。 :
<dependencyManagement>
<dependencies>
<dependency>
<groupId>your.group.id</groupId>
<artifactId>library-c</artifactId>
<version>2</version>
<dependency>
<dependencies>
<dependencyManagement>

然后在 library-a , library-b您将声明对 library-c 的依赖关系如下:
<dependencies>
<dependency>
<groupId>your.group.id</groupId>
<artifactId>library-c</artifactId>
<dependency>
<dependencies>

通过在父级的 dependencyManagement 中声明此依赖关系您坚持使用父模块中声明的版本的两个子模块。

  1. You want to protect yourself from unhappy dependency additions occurring in future


您可以使用 Maven Enforcer plugin在这里,特别是 dependencyConvergence规则。例如:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M1</version>
<executions>
<execution>
<id>enforce</id>
<configuration>
<rules>
<dependencyConvergence/>
</rules>
</configuration>
<goals>
<goal>enforce</goal>
</goals>
</execution>
</executions>
</plugin>

如果发现非收敛依赖项,则可以将强制执行器配置为失败或警告。

关于java - 如何在多 pom Maven 项目中固定传递依赖版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46348468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com