如果您使用Maven2作为包含许多具有相同版本号的工件的项目的构建系统,则您将所有构建的版本分散在所有pom.xml中。在其中许多甚至两次 - 在人工制品本身的版本标签和父母的版本标签中。因此,您必须在每个版本开关上更改并检入所有pom.xml的新版本。这有点令人讨厌,特别是如果你需要为几个bug修复和一个开发版本并行编写代码。有办法吗?
澄清:我的问题是你的源代码管理系统中每个pom.xml的许多版本,它们只有pom的版本号和/或父pom的版本号不同。理想情况下,只要添加依赖项或其他内容,就应该只需要更改pom。
例如,你有一个项目包含文件foo-pom(所有的父pom),foobar-jar,foobaz-jar和foo-war。在第一个版本中,版本是1.0 - 它出现在每个pom.xml中。在第二个版本中,版本为1.1 - 它再次出现在每个pom.xml中。因此,您必须更改每个pom.xml - 如果您按照自己的意愿发布,这很烦人。
更新:如果您认为这很重要:不必另外指定父版本。请转到maven JIRA issue并投票给它以使其更受关注,并且更有可能在即将发布的版本中添加为增强功能。您需要为此创建/拥有JIRA登录。
another Stackoverflow Question基本上是同一个问题。
答案 0 :(得分:18)
有another StackOverflow thread that also covers this topic that you might want to look at。
简而言之,在使用继承时不必指定父版本是already being considered. Please go over to JIRA and give it a vote bump以使其更受关注,并且更有可能在即将发布的版本中添加为增强功能。
答案 1 :(得分:8)
我在使用Maven 2构建的大型系统上遇到了类似的问题。
在我看来,典型的多模块结构的缺点是所有模块
必须共享相同的版本。这确实很烦人:即使你的
下一个版本只包含foobar-jar
中的错误修复,您需要
随处更改全局版本(无论是手动还是使用
maven-release-plugin
)并推出每个组件的新版本。在我的例子中,我构建了各种WAR / EAR应用程序,因此我的客户会问我为什么我只提供app1
和app2
的新版本,只有app1
应该受到影响
相反的方法是将每个组件作为独立组件进行管理 项目,拥有自己的独立版本。这样更灵活 允许部分发布,但您现在需要跟踪所有这些版本 手动(知道您的下一次交付将包含哪些版本,制作 确保内部依赖性是一致的,等等。这可以很快 在大型应用程序中成为一场噩梦。
我一直在考虑将这两种方法结合起来的方法:独立版本的灵活性,而不会放弃系统的全局一致性。我尝试了与romaintaz相同的方法,并遇到了同样的问题。最后,我提出了这个想法: http://out-println.blogspot.com/2008/10/maven-modules-with-independent-versions.html
将其视为“实验性”,因为我最终没有尝试过它(出于非技术原因)。但我认为它会成功。
答案 2 :(得分:7)
在我的项目中,我遇到了这样的问题。为了减少我在父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中明确输入父版本。 例如,在我的业务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>
但是,我真的建议您查看release plugin,它会为您修改所有版本号。
答案 3 :(得分:7)
这article是否为您的问题提供了解决方案?
我们的想法是将整个项目的版本号声明为属性,即父pom中的“厌恶”(双关语)。父pom自己的版本号可以是任何东西,只要它以“SNAPSHOT”结尾。
子模块的版本是通过$ {aversion}属性指定的。儿童对其父母版本的引用是硬编码的。但是,由于父pom的版本是SNAPSHOT,子模块将看到父pom中的更改。特别是,如果父pom更改$ {aversion}的值,孩子们将看到更改。
根据评论,这不是一个完美的解决方案。
发布插件无法解决实际问题:合并 无处不在的版本号副本意味着将分支重新组合在一起时会产生很多冲突。
注意:
使用Maven 2.0.9(最新版本 - 2008年4月)我只是忽略了各个模块的版本元素,因为它们将继承父版本的版本。如果您的模块与其父模块共享相同的groupId,这也适用于groupId。
答案 4 :(得分:3)
这是一个可以扩展maven的想法,可以解决问题。 目前,您必须在pom.xml中编写工件的版本和父pom的版本。已经有办法为父pom提供绝对位置:
<parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
如果您允许省略父级和此pom的版本,如果maven能够通过相对路径访问父pom,那么您就完成了。该版本仅在父pom中提及,而在其他任何地方都没有。
答案 5 :(得分:1)
我们确实存在这个问题。我们有大量(大约10个)不同的项目,其中一些项目相互依赖。包含项目的文件夹具有整个项目集的父pom。每次我们创建一个新的分支时,我们必须进入每个pom文件以更改&lt; version&gt;元素以及&lt; version&gt;对于父母来说,所有这些编辑都很烦人。
在阅读了这个问题和答案后,我意识到情况是没有希望的。每个项目都可以继承&lt; version&gt;来自父pom的元素,以便很容易消除,但我们显然无法继承&lt; version&gt;对于&lt; parent&gt;。
不幸的是,我忘了告诉我的同事这是不可能的,所以他修好了。他的解决方案是在父pom文件中添加一个属性:
<properties><currentVersion>2.6.1-SNAPSHOT</currentVersion></properties>
然后在子pom文件中我们声明了父版本标签:
<version>${currentVersion}</version>
我不知道为什么会这样。我没有看到如何在没有指定版本号的情况下找到合适的父pom。但对我来说(maven版本1.5.0_22)正在工作。
答案 6 :(得分:0)
在解决maven issue之前,这是另一个轻量级解决方法。在一个大型项目中,我们不再将pom.xml本身放在版本控件中,而是放置一个pom-template.xml,它只包含版本号的占位符。从版本控制更新项目树后,您需要运行一个ant脚本,在每个目录中生成实际的pom.xml。这很烦人,但不如忍受所有那些令人讨厌的pom版本而烦人。