Maven 将依赖关系中介策略设置为最新策略而不是最接近

2022-09-02 22:00:59

是否可以将 Maven 配置为选择冲突的“最新”依赖项,而不是“最近”依赖项?

“最新”是 Ivy 和其他合理的依赖项管理器中的默认值,请参阅 http://ant.apache.org/ivy/history/2.2.0/settings/conflict-managers.html

我发现“最接近”的策略很少是我想要的。

我使用的是 Maven 3.3.3,但如有必要,我可以切换版本。

我知道如何覆盖Maven对单个冲突的选择,但我更喜欢更改默认值,这样我就不必一次检测和修复每个冲突。

(参见 Maven 关于“依赖关系调解”的文档)


答案 1

是否可以将 Maven 配置为在解决版本冲突时自动使用依赖项的“最新”版本,而不是“最接近”版本?

可以,您不能将 Maven 的依赖关系中介策略配置为最接近的以外的任何策略。

以前曾有人提出过添加可配置的依赖关系中介策略,但最终被放弃,因为该提案涉及更改POM XSD,而这已经多年没有发生过。

为什么 Maven 使用最接近的策略作为默认值?

最接近的策略受到Maven的青睐,原因有两个:

  1. 轻松覆盖各个冲突:对于任何特定的冲突依赖项,您可以在自己的 POM 中指定其版本,该版本将成为最接近的版本。
  2. 可重现的版本:依赖项关系图中任何位置的版本范围都可能导致生成不可重现。“最新”的中介策略将放大版本范围对构建可重复性的负面影响。

但我真的想要一个不同的依赖关系调解策略。我该怎么办?

这些是您的最佳选择:

  1. 制作 Maven 扩展:“最近”策略的使用由 MavenRepositorySystemUtils 中的 NearestVersionSelector 指定。您可以创建自己的 Maven 扩展,该扩展定义您自己的 VersionSelector,用于实现您选择的策略,然后在扩展的方法中,将会话替换为使用自定义的会话。afterSessionStartDependencyGraphTransformerVersionSelector
  2. 迁移到另一个构建工具:显然。

答案 2

您还可以对 Maven “enforcer” 插件使用 “requireUpperBoundDeps” 规则,该插件不会直接实现“最新获胜”冲突解决策略,但会强制最终结果是相同的。您需要手动将可传递依赖项或规则添加到POM中,以选择每个冲突中的最新依赖项,但至少您将确信最终结果是“最新的胜利”。<exclusions><dependencyManagement>

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.4.1</version>
    <executions>
      <execution>
        <id>enforce</id>
        <configuration>
          <rules>
            <requireUpperBoundDeps />
          </rules>
        </configuration>
        <goals>
          <goal>enforce</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

推荐