在 Maven 中自动获取最新的传递依赖
Automatically taking the newest transitive dependency in maven
考虑一个非常常见的情况,当一个项目依赖于 2 个库,每个库都传递了不同版本的第三个库:
Project A:
Library B:
Library D: version 1
Library C:
Library D: version 2
我可以使用 maven enforcer plugin's dependencyConvergence rule 来检测此类问题,然后直接在我的项目 A 的 pom 中指定库 D 的版本,例如 部分。
但这又产生了另一个问题:现在我必须手动跟踪库 D 的版本,即使我的项目没有直接使用它。
每次更改库 B 或库 C 的版本时,我都必须记住在我的项目中也更新库 D 的版本。很容易忘记!
有没有办法告诉 maven 只使用最新版本的传递库?
类似于:
<dependencyManagement>
...
<dependency>
<groupId>path.to</groupId>
<artifactId>library-D</artifactId>
<version>
<use_newest_one_from_all_transitive_dependencies_please/>
</version>
</dependency>
有办法实现吗?
不,正如khmarbaise所说,这是不可能的。
解析规则深深植根于 Maven 本身。您可以查看解析结果(正如您已经提到的),但不能更改它。
我们决定通过使用我们在 <dependencyManagement>
部分中 import
的适当 BOM(依赖管理列表)来修复几乎所有版本的传递依赖项。这保证了所有依赖项都来自最新版本。它不保证一切都适合。但是使用最新版本作为标准也不会这样做。
您可以只添加依赖项,然后按照建议自动管理它 here. This uses the Maven Versions Plugin。当然,它将采用最新版本,而不是最新的传递依赖版本。版本范围也是可能的,但不鼓励使用它们。
考虑一个非常常见的情况,当一个项目依赖于 2 个库,每个库都传递了不同版本的第三个库:
Project A:
Library B:
Library D: version 1
Library C:
Library D: version 2
我可以使用 maven enforcer plugin's dependencyConvergence rule 来检测此类问题,然后直接在我的项目 A 的 pom 中指定库 D 的版本,例如
但这又产生了另一个问题:现在我必须手动跟踪库 D 的版本,即使我的项目没有直接使用它。
每次更改库 B 或库 C 的版本时,我都必须记住在我的项目中也更新库 D 的版本。很容易忘记!
有没有办法告诉 maven 只使用最新版本的传递库?
类似于:
<dependencyManagement>
...
<dependency>
<groupId>path.to</groupId>
<artifactId>library-D</artifactId>
<version>
<use_newest_one_from_all_transitive_dependencies_please/>
</version>
</dependency>
有办法实现吗?
不,正如khmarbaise所说,这是不可能的。
解析规则深深植根于 Maven 本身。您可以查看解析结果(正如您已经提到的),但不能更改它。
我们决定通过使用我们在 <dependencyManagement>
部分中 import
的适当 BOM(依赖管理列表)来修复几乎所有版本的传递依赖项。这保证了所有依赖项都来自最新版本。它不保证一切都适合。但是使用最新版本作为标准也不会这样做。
您可以只添加依赖项,然后按照建议自动管理它 here. This uses the Maven Versions Plugin。当然,它将采用最新版本,而不是最新的传递依赖版本。版本范围也是可能的,但不鼓励使用它们。