多组件版本控制/构建最佳实践

时间:2013-04-03 20:10:46

标签: java maven versioning

我有一个使用Maven构建的Java项目,它聚合了几个组件,每个组件都在自己的Maven项目中。这些组件中的任何一个都可能单独发展。

我的项目结构可以描述如下:

  • my-main-project取决于:
    • 我的组分-1
    • 我的组分-2

如今,所有pom.xml都使用“快照”版本,因此,它们都使用我的存储库中提供的“最新”版本。

但是一旦我向客户发送了发布版本,我应该冻结版本并在源代码控制中生成TAG(或等效版本),这样我就可以在维护时恢复以前的状态。

所以,我的问题是:我应该在每次发布之前更改所有pom.xml文件,为组件提供版本号,并将所有内容与此依赖项版本联系起来吗?另外,如果我有很多组件(我的项目当前有30多个小子组件),我必须在每次发布之前重新编号/恢复每个组件吗?当单个组件发展时(由于错误修复或增强),我是否必须增加其版本以使更改不会影响预先存在的版本,对吧?

使用maven的人通常如何处理这个多组件版本控制案例?

当然,我可以依靠我的版本控制标签恢复到以前的时间点并只标记每个版本上的每个组件,但我不喜欢这种方法,因为依赖版本化(与maven)让我对打包的内容以及(破坏)兼容性的关系以及更多内容给予了更多的控制和可见性。

2 个答案:

答案 0 :(得分:0)

一般注意事项

您可以考虑组件之间的某些关系。 它们真的是独立的(每一个都相互对立)吗?或者是否有某种关系...一些公共生命周期?

如果您发现它们之间存在某种关系,请考虑使用 maven multi-modules http://www.sonatype.com/books/mvnex-book/reference/multimodule.html。简而言之,您将拥有一个父版本,一个版本和一些模块(一些罐子......就像Spring及其子模块一样)。这将有助于您减少版本管理。

您可以考虑使用 maven-release-plugin 。它将帮助您自动标记,构建和部署模块,更轻松地处理版本控制以及与SCM和存储库的链接。 此外,结合多模块,它将极大地帮助您!

Stack Overflow上有很多关于此问题的主题。

我不知道你是否已经知道这一点。如果你愿意,我可以进一步解释它,但如果你不这样做,你可能有足够的元素可以自己搜索。

直接答案

  

所以,我的问题是:我应该在每次发布之前更改所有pom.xml文件,为组件提供版本号,并将所有内容与此依赖项版本联系起来吗?

是的,你应该。在应用程序生命周期管理中,遵循更改非常重要。因此,正如您所想象的那样,当您指出它时,您应该构建并标记每个组件。这可能很痛苦,但maven-realease-plugin和multi模块(即使使用Continuous Integration平台)也可能更容易。

  

我必须在每次发布之前重新编号/回复每一个吗?

出于完全相同的原因:是的!

  

我必须增加其版本,以便更改不会影响预先存在的版本,对吗?

是的,你也应该。假设您选择了一个像MAJOR.minor.correction这样的常见版本,第一个数字表示兼容性中断。次要版本会带来一些休息,但不应该。更正不会影响兼容性。

  

使用maven的人通常如何处理这个多组件版本控制案例?

我无法回复每个人,但我之前对发布插件和多模块的评论被视为最佳实践。如果你想进一步,你可以想象使用更强大的SCM(Clearcase,Perforce,...),但是maven集成更少,没有“很好”记录,社区提供的例子比SVN或Git少。

答案 1 :(得分:0)

Maven Release Plugin

如果您使用的是多模块pom.xml,则应该可以执行mvn release -DautoVersionSubmodules并让它对所有依赖项执行“发布”构建,并删除-SNAPSHOT版本和将它们上传到您的存储库。这就是release插件及其工作流程的唯一目的。