我可以配置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的青睐有两个原因:
- 轻松覆盖单个冲突 :针对任何特定冲突依赖关系,您可以在自己的POM中指定其版本,该版本将成为最接近的版本
- 可复制构建 :依赖关系图中的任何版本范围都可能导致构建不可复制。"最新"的中介策略会放大版本范围对构建再现性的负面影响
但我确实想要一个不同的依赖中介策略。我能做什么
以下是您的最佳选择:
-
制作Maven扩展
:"最近"策略的使用由
NearestVersionSelector
在MavenRepositorySystemUtils
中指定。您可以创建自己的Maven扩展,定义自己的VersionSelector
,实现您选择的策略,然后在扩展的afterSessionStart
方法中,将会话的DependencyGraphTransformer
替换为使用自定义VersionSelector
的方法 - 迁移到另一个构建工具 :显然
您还可以将"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>