maven;如何打破向后兼容性?

问题描述:

Maven有一个版本管理系统,如果引用多个版本,它会选择最高版本的库。例如,如果一个pom指的是版本1.1,而pom B指向1.2,那么pom C(指的是A和B)将使用最高版本; 1.2。maven;如何打破向后兼容性?

该方法假设1.2与1.1向后兼容100%,这是一个很好且必需的方法。但是,在图书馆生命周期的某些时候,清理商店是明智的。对于我来说,API的任何重大变化都意味着增加主要版本,所以2.0并不需要100%向后兼容最新的1.x版本。精细。然而,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)。

+0

我不明白你想要完成什么。如果需要不兼容的版本,你是否试图让构建中断?或者,你是否试图让maven解决旧版本...? – jtahlborn 2011-04-05 17:15:17

+0

如果存在使用相同库的不兼容版本的两个依赖项,则构建应该失败。 – Tbee 2011-04-05 18:16:00

+0

不可能在类路径中包含两个依赖.jar文件,只有第一个依然会被使用。无论Maven的行为如何,您所要求的都是不可能的。 – 2011-09-01 19:55:23

我会更改工件ID(可能通过添加主版本号)。这将使1.x和2.x版本与Maven不同。

+0

您希望OP在其主版本更改时更改对象的工件ID吗?这似乎是极端的...... – Jonathan 2011-04-05 17:32:05

+1

那么简单会导致类路径中包含相同库的两个版本吗? TheLib1.jar和TheLib2.jar?这个想法是产生一个错误。 – Tbee 2011-04-05 17:38:44

+0

我不是在暗示为每件神器做这件事。只有那些将API从一个版本分解到另一个版本的应用程序。只要内部不冲突,使用两种不同的API也不一定是错误。 – 2011-04-05 18:40:34

首先这是一个不好的做法在Maven的使用version ranges进一步构建你必须定义一个版本编号定义它说1.0和1.1必须向后兼容,而2.0是不是但这是你必须做出一个定义。 Maven不知道这一点。我会建议使用Major.Minor.Increment-Qualifier等。在我看来,你应该固定你的版本修复,否则你无法重现你的构建。

+0

Gentoo通过引入槽的概念解决了这个问题http://devmanual.gentoo.org/general-concepts/slotting/index.html – Tbee 2011-04-05 17:48:00

你看过maven执行者插件吗?它可能有这样的事情,或者你可以写一个自定义规则。