禁用Maven依赖关系调解

14

由于我不信任Maven在依赖冲突解决中选择“最佳”版本,因此我希望在pom文件中未明确固定依赖版本(通常使用dependencyManagement)时,如果存在版本冲突,则构建失败。

Enforcer插件的dependencyConvergence规则似乎是我要寻找的,但不幸的是,它无法处理*-excludes(https://issues.apache.org/jira/browse/MENFORCER-195),因此我无法真正使用它。

有没有其他方法可以阻止Maven应用“最近的依赖优先规则”,而是让pom所有者决定使用哪个版本?


我认为唯一的方法是手动排除所有传递依赖项,但保留一个必需的依赖项,或者手动排除所有内容并手动将特定版本添加到pom文件中。 - evgenii
@evgenii 不是的。目前为止最好的方法要么是完全避免使用“*-exclusions”,要么是修复dependencyConvergence规则(正如kriegaex所说,已经有一个pull request,但需要进行适当的测试)。我仍然希望有更好的解决方案(某些已达到beta或发布状态的解决方案)。 - J Fabian Meier
如果我正确理解了问题,您想停止Maven自动传递解析,并决定自己的传递版本,以避免与自己管理的依赖项发生冲突。因此,请提供您配置的维度。有许多解决方法,但这取决于您的情况。 - Hisham Khalil
问题不在我的项目中。我负责为100多个开发人员提供父POM(并配置插件)。我需要一种可靠的方法,可以直接使用(如果有人编写了官方修复* -exclude问题的enforcer插件,则会成为这样的东西)。 - J Fabian Meier
@AlexNikolaenkov 是的。 - J Fabian Meier
显示剩余2条评论
2个回答

3
你可以使用Maven Enforcer Plugin,如果dependencyConvergence被违反,构建将失败。尝试一下并看看它是否符合你的要求。 更新:抱歉,我刚才注意到你尝试过并且在排除方面遇到了问题。你是否尝试使用链接票证中的拉取请求构建插件,并查看它是否能为你解决问题?

如果我找不到其他解决方法,我会尝试一下。但由于有很多边缘情况(例如问题中的情况),并且我要为100多个开发人员编写一个父级pom文件,这将需要大量测试,然后才能推出这样一个“非官方版本”。 - J Fabian Meier
嗯,"官方"版本似乎存在缺陷,因此也许你最好使用一个(尚未"官方"的)补丁来解决该问题。但当然,彻底测试绝对是一个明智的决定。你可以为你的巨大父POM运行两个版本,看看它是否a)修复了你已知的问题,b)显示了以前正确结果的任何回归。我只是想帮忙,我也没有测试过那个拉取请求。 - kriegaex

1
你可以使用依赖版本范围明确定义Maven应该使用哪个版本。
基本上,你只需要用圆括号(排除量词)或方括号(包含量词)将你的版本包围起来。
例如:
<version>[4.2]</version>

这意味着:使用 4.2 版本并且不要使用其他版本。
或者:
<version>[4.2,)</version>

意思是:使用版本4.2或更高版本。
或者:
<version>(,4.2]</version>

意思是:“请使用版本低于或等于4.2的版本。”其中保留了HTML标记。

谢谢,但那不是我想要的。我的关注点是出现在多个版本中的传递依赖项。 - J Fabian Meier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接