maven项目的层次结构,不散布版本号

如果使用Maven2作为包含许多具有相同版本号的工件的项目的构build系统,那么将生成的构build版本分散在所有的pom.xml中。 在其中许多甚至两次 – 在人造物本身的版本标签和父母的版本标签中。 因此,您必须在每个版本交换机上更改并检入所有pom.xml的新版本。 这有点令人讨厌,特别是如果你不得不并行编译几个bug修复和一个开发版本。 有没有办法呢?

澄清:我的问题是在源代码pipe理系统中,随着时间的推移,每个pom.xml的许多版本只有pom的版本号和/或父pom的版本号不同。 理想情况下,只要你添加一个依赖项或者其他东西,你只需要改变一下。

例如,你有一个项目与工件foo-pom(父pom到所有),foobar-jar,foobaz-jar和foo-war。 在第一个版本中,版本是1.0,它出现在每个pom.xml中。 在第二个版本中,版本是1.1 – 它再次出现在每个pom.xml中。 所以你必须改变每一个pom.xml – 这是很烦人的,如果你经常发布你应该的。

更新:如果你认为这很重要:不必指定父版本已被考虑。 请转到Maven的JIRA问题,并投票给它,让它更受关注,更有可能在即将发布的版本中作为增强添加。 你需要创build/拥有一个JIRAlogin。

还有另一个基本上是相同的问题的Stackoverflow问题。

还有另一个StackOverflow线程也涵盖了你可能想要看的主题 。

简而言之,在使用inheritance时不必指定父版本已经被考虑。 请转到JIRA并投票表决,以使其更受关注,并且更有可能在即将发布的版本中添加为增强function。

在使用Maven 2构build的大型系统上工作时遇到了类似的问题。

在我看来,典型的多模块结构的缺点是所有模块必须共享相同的版本。 这确实很烦人:即使你的下一个版本只包含foobar-jar中的一个bug修正,你也需要随时更改全局版本(手动或者使用maven-release-plugin )并且推出一个新版本的每个组件。 在我的情况下,我构build了各种WAR / EAR应用程序,所以我的客户会问我为什么我交付了app1app2的新版本,只有app1应该受到影响。

相反的方法是将每个组件作为一个独立的项目来pipe理,并拥有独立的版本。 由于它允许部分发布,因此更灵活,但是现在需要手动跟踪所有这些版本(了解下一个发布将包含哪些版本,确保内部依赖关系是一致的等)。 这可能很快成为大型应用程序的噩梦。

我一直在想办法把两种方法结合起来:独立版本的灵活性,而不放弃系统的全球一致性。 我尝试了与romaintaz相同的方法,并遇到同样的问题。 最后,我想出了这个想法: http : //out-println.blogspot.com/2008/10/maven-modules-with-independent-versions.html 。

把它看作是“实验性的”,因为我没有得到最后的尝试(因为非技术原因)。 但是我认为这样做会有诀窍。

在我的项目上,我有这样的问题。 为了减less我在我的父pom.xml中定义的版本的数量,这些属性对应于每个模块的版本:

 <properties> <project-version>1.0.0</project-version> <!-- Same version than the parent for the module 'commons' --> <project-commons-version>${project-version}</project-commons-version> <!-- A specific version for the 'business' module --> <project-business-version>1.0.1</project-business-version> ... 

然后,在每个模块的pom.xml中,我使用这些属性。 问题是我必须在这个pom.xml中明确地input父代的版本。 例如,在我的业务pom.xml中,我有:

 <project> <modelVersion>4.0.0</modelVersion> <!-- I must indicate the version of the parent --> <parent> <groupId>my.project</groupId> <artifactId>parent</artifactId> <version>1.0.0</version> </parent> ... <dependencies> <!-- However, in my dependencies, I use directly the properties defined in the parent's pom.xml --> <dependency> <groupId>my.project</groupId> <artifactId>project-persistence</artifactId> <version>${project-persistence-version}</version> </dependency> 

不过,我真的build议你看一下release插件 ,它将会帮你修改所有的版本号。

这篇文章是否为您的问题提供了解决scheme?

这个想法是把整个项目的版本号作为一个属性来声明,即在父项目中“厌恶”(双关)。 父Pom自己的版本号可以是任何东西,只要以“SNAPSHOT”结尾。

子模块的版本是通过$ {aversion}属性指定的。 儿童对其父母版本的引用是硬编码的。 但是,由于父pom的版本是SNAPSHOT,子模块将会看到父pom中的更改。 特别是,如果父pom更改$ {aversion}的值,孩子们将看到更改。

根据评论不是一个完美的解决scheme。

释放插件并没有解决真正的问题: 合并
将版本号无休止地拷贝到整个地方意味着将分支重新组合在一起时会产生很多冲突。

注意:

使用Maven 2.0.9(最近一次 – 2008年4月)我只是从各个模块中省略了版本元素,因为它们将inheritance父版本。 这也适用于groupId,如果你的模块与他们的父级共享相同的groupId。

这是一个可以扩展的解决问题的maven的想法。 目前,您必须在pom.xml中编写工件的版本和父POM的版本。 已经有一种方法可以给父Pom一个绝对的位置:

 <parent> <groupId>org.codehaus.mojo</groupId> <artifactId>my-parent</artifactId> <version>2.0</version> <relativePath>../my-parent</relativePath> </parent> 

如果你允许省略parent和pom的版本iff maven能够通过相对path访问父pom,你就完成了。 该版本只在父pom和其他地方提到。

我们有这个问题。 我们有大量的(大约10个)不同的项目,其中一些项目相互依赖。 包含项目的文件夹具有整个项目集的父项目。 每次我们创build一个新的分支时,我们必须进入每一个pom文件来更改<version>元素和父版本的<version>,所有这些编辑都很烦人。

在阅读了这个问题和答案之后,我意识到情况是绝望的。 每个项目都可以inheritance父pom中的<version>元素,这样就很容易消除,但显然不能inheritance<parent>的<version>。

不幸的是,我忘记告诉我的同事这是不可能的,所以他修好了。 他的解决scheme是添加一个属性到父pom文件中:

 <properties><currentVersion>2.6.1-SNAPSHOT</currentVersion></properties> 

然后在子pom文件中,我们声明了如下的父版本标签:

 <version>${currentVersion}</version> 

我不知道为什么这个工作。 我没有看到如何find没有指定版本号的正确的父pom。 但对我来说(maven版本1.5.0_22)它正在工作。

这是另一个轻量级的解决方法,直到解决maven问题 。 在一个大的项目中,我们不再把pom.xml本身放在版本控制中,而是一个只包含版本号的占位符的pom-template.xml。 从版本控制更新项目树后,您需要运行一个小的ant脚本,在每个目录中生成实际的pom.xml。 这是烦人的,但比不得不忍受所有那些令人烦恼的pom版本恼人。