17

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

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

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

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

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

(请参阅有关“依赖中介”的 Maven 文档)

4

2 回答 2

11

我可以将 Maven 配置为在解决版本冲突时自动使用“最新”版本而不是“最近”版本吗?

,您不能将 Maven 的依赖中介策略配置为最近的任何东西。

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

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

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

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

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

这些是您的最佳选择:

  1. 进行 Maven 扩展:“最近”策略的使用由NearestVersionSelectorinMavenRepositorySystemUtils指定。您可以创建自己的 Maven 扩展来定义您自己VersionSelector的实现您选择的策略的扩展,然后在afterSessionStart您的扩展的方法中,将会话替换为DependencyGraphTransformer使用您的自定义VersionSelector.
  2. 迁移到另一个构建工具:显然。
于 2017-04-02T07:17:53.600 回答
4

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

  <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>
于 2017-04-04T22:12:38.093 回答