【问题标题】:Maven set dependency mediation strategy to newest rather than nearestMaven 将依赖中介策略设置为最新而不是最近
【发布时间】:2016-03-16 01:02:00
【问题描述】:

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

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

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

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

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

(参见the Maven docs“依赖中介”)

【问题讨论】:

  • 如果你说你很少不想要是一种意见。据我所知,没有简单的方法可以改变这种行为......你可以做的是提供一个补丁来改变 Maven Core 中的行为......要检测这些事情,你可以使用强制规则来识别这种情况...... ..
  • This discussion 之前尝试将此功能添加到 Maven 值得一读。
  • 谢谢,@heenenee。我现在明白为什么 Maven 在过去 10 年左右的时间里根本没有进化,它似乎完全奄奄一息。也许我会尝试将我的项目切换到 SBT,它具有最新的依赖冲突解决方案,并且可以消耗 Maven deps,并且受 IntelliJ 支持。
  • @Rich 我将讨论中最相关的部分提取为答案。我通常不会用“否”来回答问题,但我觉得在这种情况下这是有道理的。在继承源代码时,如果它是一个 Maven 项目,我通常会很高兴,因为构建很容易理解(很大程度上是因为 Maven 发展如此缓慢),但是我通常使用 Gradle 开始我自己的新项目。您应该使用最适合您和您的团队的方法;如果那是 SBT,那就去吧。

标签: java maven conflicting-libraries


【解决方案1】:

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

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

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

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

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

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

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

这些是您最好的选择:

  1. 制作一个 Maven 扩展:“最近”策略的使用由 NearestVersionSelector in MavenRepositorySystemUtils 指定。您可以 create your own Maven extension 定义您自己的 VersionSelector 来实现您选择的策略,然后在您的扩展程序的 afterSessionStart 方法中,将会话的 DependencyGraphTransformer 替换为使用您的自定义 VersionSelectorVersionSelector
  2. 迁移到另一个构建工具:显然。

【讨论】:

  • 谢谢。构建插件不能覆盖这种行为吗?这将提供一条在不更改 POM XSD 的情况下更改它的路径。
  • 此评论表明构建插件无法更改依赖项:“Maven 3.x 引入了依赖项解析的更改,这使得该插件无法以最佳方式运行。在 Maven 3.x 之前,所有依赖项都已解决生命周期阶段已经启动,使得插件无法在 Maven 解析项目的依赖项之前下载和安装外部依赖项。” github.com/UniversalMediaServer/…
  • @Rich 正如您所引用的,插件不会在可以更改冲突解决策略的时候执行,因此执行此操作的插件是不可行的。但是,您可以进行 Maven 扩展,因此我已经相应地更新了我的答案。
  • 值得强调AbstractMavenLifecycleParticipant.afterSessionStart 在声明为构建<extension> 或通过插件的<extensions> 时不会被调用,必须在${maven.home}/lib/ext${maven.projectBasedir}/.mvn/extensions.xml .只有在afterSessionStartsession.getRepositorySession() 是可修改的,在调用afterProjectsRead 时它是只读的。
【解决方案2】:

您还可以对 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2012-12-22
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多