Maven将依赖关系调解策略设置为最新而非最近的策略

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

“最新”是常春藤和其他合理依赖管理器的默认值,请参阅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喜欢采用最接近的策略,原因有二:

  • 轻松覆盖个别冲突 :对于任何特定的冲突依赖项,您可以在自己的POM中指定其版本,并且该版本变得最接近。
  • 可重复构建 :依赖关系图中任何位置的版本范围都可能导致构建不可重现。 “最新”的调解策略会放大版本范围对构建可重复性的负面影响。
  • 但我真的想要一个不同的依赖关系调解策略。 我能做什么?

    这些是你最好的选择:

  • 制作Maven扩展 :“最近”策略的用法由NearestVersionSelector中的MavenRepositorySystemUtils指定。 您可以创建自己的Maven扩展,该扩展定义了自己的VersionSelector ,它实现了您选择的策略,然后在扩展的afterSessionStart方法中, afterSessionStartDependencyGraphTransformer替换为使用您的自定义VersionSelectorDependencyGraphTransformer
  • 迁移到另一个构建工具 :显然。

  • 您也可以对Maven“执行者”插件使用“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>
    
    链接地址: http://www.djcxy.com/p/31077.html

    上一篇: Maven set dependency mediation strategy to newest rather than nearest

    下一篇: UIWebView resizes on loadRequest