2009-01-06 63 views
36

如果您使用Maven2作为包含具有相同版本号的许多工件的项目的构建系统,则生成的构建版本将散布在所有pom.xml中。它们中的许多甚至两次 - 在人造物本身的版本标签和父版本标签中。因此,您必须在每个版本交换机上更改并检入所有pom.xml的新版本。这有点令人讨厌,特别是如果您必须并行编写几个错误修复和开发版本。有没有办法解决这个问题?没有散布版本号的maven项目的层次结构

CLARIFICATION:我的问题是关于在源代码管理系统中随着时间的推移,每一个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这基本上是一样的问题。

回答

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,将采取所有修改的版本号为您服务。

+0

这就是我们正在使用的模式 - 除了发布插件。我想知道是否可以以某种方式避免将父版本放在每个pom.xml中。但是,似乎你必须与源代码控制中的许多版本一起生活,这些版本只有父版本才有所不同。 – 2009-01-06 15:15:53

+1

我认为这种方法可以用Maven版插件补充:http://mojo.codehaus.org/versions-maven-plugin 它可以自动增加子项目中的parent.version标签;请参阅版本:update-child-modules目标。 – Dan 2009-05-13 16:38:45

7

这个article是否为您的问题提供了解决方案?

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

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

根据评论不完美的解决方案。

而发布插件并没有解决真正的问题:合并
将分支版本号复制到整个地方意味着将分支重新聚合在一起时会产生很多冲突。

注:

与Maven 2.0.9(最新一期 - 2008年4月),我只是从单个模块省略版本元素,因为他们将继承其父的版本。这也适用于groupId,如果你的模块与他们的父母共享相同的groupId。

+2

VonC是正确的,你可以省略你的pom的groupId和artifactId,如果你希望它们和父母一样。但挑战仍然存在,即使在多模块分层构建中,您也必须专门声明父代的版本。 – 2009-02-26 04:43:21

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当且仅当行家的两个版本的遗漏是能够通过相对路径来访问父POM ,你完成了。该版本只在父pom和其他地方提及。

+0

比较http://jira.codehaus.org/browse/MNG-1012 – 2009-01-07 10:03:14

8

与Maven 2

在我看来建立了一个大型系统上工作时,我碰到类似的问题,典型的多模块结构的缺点是, 都模块共享相同的版本。这确实令人讨厌:即使您的下一个版本只包含foobar-jar中的错误修正,您也需要 随处更改全局版本(手动或使用 maven-release-plugin)并滚动每个组件的新版本。在我的情况下,我制作了各种WAR/EAR应用程序,因此我的客户会问我为什么我提供了app1app2的新版本,当时只有app1应该受到影响。

相反的方法是将每个组件作为独立的 项目进行管理,并拥有自己的独立版本。这是更灵活的,因为它允许部分版本,但你现在需要手动跟踪所有这些版本 (知道你的下一个交付将包含哪些版本,使 肯定内部依赖性是一致的等)。这很快就会在大型应用程序中成为一场噩梦。

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

认为它是'实验',因为我没有得到尝试它结束(因为非技术原因)。但我认为它会做到这一点。

+0

博客链接已死,请提供新的链接吗? – 2015-02-26 12:15:46

0

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

1

我们正是这个问题。我们有大量(大约10个)不同的项目,其中一些项目相互依赖。包含这些项目的文件夹对于整个项目集都有一个父项目。每次我们创建一个新分支时,我们都必须进入每个pom文件,以便为父级更改<版本>元素以及<版本>,并且所有这些编辑都很烦人。

在阅读了这个问题和答案后,我意识到情况是没有希望的。每个项目都可以继承父pom中的< version>元素,这样可以很容易地消除,但我们显然无法继承<版本> < parent>。

不幸的是,我忘记告诉我的同事这是不可能的,所以他修好了。他的解决办法是将属性添加到父POM文件:

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

然后在子POM文件,我们宣布父版本标签是这样的:

<version>${currentVersion}</version> 

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