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

时间:2015-12-10 11:49:13

标签: java maven conflicting-libraries

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

“最新”是Ivy和其他合理的依赖管理者的默认设置,请参阅http://ant.apache.org/ivy/history/2.2.0/settings/conflict-managers.html

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

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

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

(参见the Maven docs关于“依赖调解”)

2 个答案:

答案 0 :(得分:7)

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

,您无法将Maven的依赖关系中介策略配置为最近的其他内容。

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

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

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

  1. 轻松覆盖个别冲突 :对于任何特定的冲突 依赖关系,您可以在自己的POM中指定其版本,并且该版本将成为最接近的版本。
  2. 可重现的构建 Version ranges依赖关系图中的任何位置都可能导致构建无法重现。 “最新”的调解策略会放大版本范围对构建再现性的负面影响。
  3. 但我真的想要一个不同的依赖中介策略。我该怎么办?

    这些是您最好的选择:

    1. 制作Maven扩展程序 NearestVersionSelector in MavenRepositorySystemUtils指定使用“最近”策略。您可以create your own Maven extension定义自己的VersionSelector,然后在您的扩展程序的afterSessionStart方法中,将会话的DependencyGraphTransformer替换为使用您的会话的VersionSelector自定义import javax.json.*; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonObjectBuilder; import javax.json.JsonWriter; class JsonTest { public static void main(String[] args){ JsonObject obj = Json.createObjectBuilder() .add("name", "foo") .add("num", new Integer(100)) .add("balance", new Double(1000.21)) .add("is_vip", new Boolean(true)).build(); System.out.print(obj); } }
    2. 迁移到其他构建工具 :显然。

答案 1 :(得分:2)

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

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