Maven 将依赖调解策略设置为最新而不是最近

Maven set dependency mediation strategy to newest rather than nearest

我可以配置 Maven 以选择 "newest" 依赖冲突,而不是 "nearest" 吗?

"newest" 是 Ivy 和其他明智的依赖管理器中的默认值,参见 http://ant.apache.org/ivy/history/2.2.0/settings/conflict-managers.html

我发现 "nearest" 策略很少是我想要的。

我正在使用 Maven 3.3.3,但如果需要我可以切换版本。

我知道如何覆盖 Maven 对个别冲突的选择,但我更愿意更改默认设置,这样我就不必一次检测并修复每个冲突。

(参见 "Dependency mediation" 上的 the Maven docs

我可以将 Maven 配置为在解决版本冲突时自动使用依赖项的 "newest" 版本而不是 "nearest" 吗?

,您不能将 Maven 的依赖调解策略配置为最近以外的任何内容。

添加 configurable dependency mediation strategies has been proposed before,但最终被放弃,因为该提议涉及更改 POM XSD,这已经多年没有发生了。

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

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

  1. 轻松覆盖个别冲突:对于任何特定的冲突 依赖项,您可以在自己的 POM 中指定其版本,并且该版本成为最近的版本。
  2. 可重现的构建Version ranges 依赖图中的任何地方都可能导致构建不可重现。 "newest" 的中介策略会放大版本范围对构建可重复性的负面影响。

但我真的想要一个不同的依赖调解策略。我能做什么?

这些是您的最佳选择:

  1. 制作 Maven 扩展:"nearest" 策略的用法由实现您选择的策略,然后在扩展程序的 afterSessionStart 方法中,将会话的 DependencyGraphTransformer 替换为使用自定义 VersionSelector.
  2. 的方法
  3. 迁移到另一个构建工具:显然。

您还可以使用 Maven "enforcer" 插件的 "requireUpperBoundDeps" 规则,它不会直接执行 "newest wins" 冲突解决策略,但会强制最终结果是相同的。您将需要手动添加传递依赖项 <exclusions><dependencyManagement> 规则到您的 POM 以在每次冲突中选择最新的依赖项,但至少您将确信最终结果是 "newest wins" .

  <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>