Maven;如何破坏向后兼容性?

4
Maven拥有一个版本管理系统,如果引用了多个版本的库,则会选择最高版本。例如,如果pom A引用版本1.1,pom B引用版本1.2,则引用A和B的pom C将使用最高版本1.2。
这种方法假设1.2与1.1完全向后兼容,这是一种好的必需方法。然而,在库的生命周期的某些时候,清理工作是明智的。对于我来说,API中的任何重大更改都意味着增加主要版本,因此2.0不需要与最新的1.x 100%向后兼容。很好。
然而,Maven并不真正关心这一点,如果pom B从1.2升级到2.0,Maven将使用2.0,但pom A无法与该版本一起使用。
如何告诉Maven版本不再向后兼容?
我尝试过指定排除范围,因此A引用[1.1、1.999)和B引用[2.0、2.999)。然而,Maven仍然解决最大版本号(2.0)。

我不明白你想要实现什么。你是想在需要不兼容的版本时使构建失败吗?还是想让Maven解析旧版本...? - jtahlborn
如果存在两个依赖项使用不兼容的同一库的版本,则构建应该失败。 - Tbee
无论Maven的行为如何,都不可能在类路径上同时包含两个依赖的.jar文件,而且只会使用第一个。你所要求的是不可能实现的。 - user177800
3个回答

3

首先,在Maven构建中使用版本范围是一种不好的做法,此外,您必须定义一个版本编号规定,即1.0和1.1必须向后兼容,而2.0则不是,但这是您需要制定的规定。Maven并不知道这一点。我建议使用Major.Minor.Increment-Qualifier等。在我看来,您应该固定您的版本号,否则您将无法重现您的构建。


Gentoo通过引入槽的概念来解决了这个问题 http://devmanual.gentoo.org/general-concepts/slotting/index.html - Tbee

1

我会更改构件ID(可能通过添加主版本号)。这将使1.x和2.x版本对于Maven来说成为不同的实体。


当主版本更改时,您希望OP更改对象的构件ID吗?那似乎有些极端了... - Jonathan
1
这样做不会导致classpath中包含两个版本的相同库吗?TheLib1.jar和TheLib2.jar?这个想法是为了生成一个错误。 - Tbee
我并不建议为每个构件都这样做。只有那些在一个版本到另一个版本时会破坏API的构件需要这样处理。同时,只要它们在内部不冲突,使用两个不同的API并不一定是错误的。 - Chris Nava

0

你有没有研究过Maven Enforcer插件?它可能有类似的功能,或者你可以编写自定义规则。


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