Maven将依赖中介策略设置为最新的,而不是最近的



我可以配置Maven来选择冲突的"最新"依赖项,而不是"最近的"依赖项吗?

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

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

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

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

(请参阅Maven关于"依赖中介"的文档)

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

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

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

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

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

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

但我确实想要一个不同的依赖中介策略。我能做什么

以下是您的最佳选择:

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

您还可以将"requireUpperBoundDeps"规则用于Maven"enforcer"插件,该插件不会直接实现"最新胜利"冲突解决策略,但会强制执行最终结果相同。您需要手动将传递依赖<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>

相关内容

  • 没有找到相关文章

最新更新