2012-04-26 117 views
6

有没有办法在不编辑POM的情况下更改版本号?有没有办法从命令行配置Maven POM的版本?

<groupId>org.example</groupId> 
<artifactId>example</artifactId> 
<version>1.0.0</version> 

我们有我们想要释放每晚构建,但没有使用Maven的-SNAPSHOT解决方案CI系统,所以如果1.0.0是当前版本中,我们只是希望有CI-NIGHTLY-BIULD-20120426

我建议这将是可能的,像mvn deploy -Dversion=CI-NIGHTLY-BIULD-20120426,但显然不是。不好的解决办法是让CI服务器每次编辑pom.xml,但我认为这是非常不方便的。

谢谢!

+1

如果您的问题与-SNAPSHOT不是唯一的,我相信Nexus的最新版本会自动为发布版本添加时间戳并安装快照尼克的名字。 – 2012-04-26 10:11:16

+0

为什么不使用SNAPSHOT就是为了这种目的。否则,为什么不使用版本? (mvn发布:...通过CI)..? – khmarbaise 2012-04-27 07:40:41

+0

好吧,也许我隐藏了很多信息,我们也有一个阶段性的CI,所以我们不仅每晚都要在几个要求满足时才发布,所以我们需要将版本从'1.0.0'更改为'1.0.0-STABLE'或“1.0.0-晚上”来分开它们。 – codevour 2012-04-27 10:37:42

回答

6

我建议使用分类器。

<groupId>foo</groupId> 
<artifactId>bar</artifactId> 
<version>1.0</version> 

<properties> 
    <!-- default classifier is empty --> 
    <my.project.classifier></my.project.classifier> 
</properties> 

<build> 
... 
<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.1</version> 
    <configuration> 
     <classifier>${my.project.classifier}</classifier> 
    </configuration> 
    <executions>...</executions> 
    </plugin> 
</plugins> 
</build> 

mvn package -Dmy.project.classifier=NIGHTLY-2012-04-26_02-30 

Maven的documentation说,关于分类:

分类:偶尔你会发现在 第五元素的坐标,那就是分类。稍后我们将访问分类器 ,但现在只需知道这些类型的项目 显示为groupId:artifactId:packaging:classifier:version。

分类器允许区分 建同样的POM,但它们的内容是不同的文物。它是一些可选的并且 任意的字符串,如果存在的话,被附加到版本号后面的工件名称 。作为这个元素的动机, 考虑了一个项目,该项目提供了一个针对JRE 1.5的工件,但同时也是一个仍支持JRE 1.4的工件。第一个神器可以配备分类器jdk15和 ,第二个可以使用jdk14,这样客户可以选择使用哪一个。

分类器的另一个常见用例是需要将辅助构件附加到项目的主构件上。如果您浏览了Maven中央存储库,您将注意到分类器源 和javadoc用于部署项目源代码和API文档 以及打包的类文件。

+0

这是一个不错的主意。尽管我不确定在正常构建的情况下是否可以将分类器保留为空白? – 2012-04-26 10:27:50

+0

是的,你可以将分类器留空 – amra 2012-04-26 14:04:57

-1

你可以参数化版本号为

<groupId>foo</groupId> 
<artifactId>bar</artifactId> 
<version>${my.project.version}</version> 

<properties> 
    <my.project.version>1.0</my.project.version> 
</properties> 

,并使用

mvn package -Dmy.project.version=NIGHTLY 

虽然这是可能的,Maven的3阻碍它的命令行驱动的版本号。

+0

谢谢,但似乎在不久的将来会被弃用。 – codevour 2012-04-26 10:08:41

+1

确实。这就是我放弃免责声明的原因。 – 2012-04-26 10:09:11

+0

这将无法正常工作,您无法将属性标识符传递给版本,Maven会投诉。 – Bitmap 2012-04-26 10:28:36

1

我强烈建议由阿克塞尔方丹读Maven Releases on Steroidspart 2part 3)。这很好,我很高兴使用它。

它不仅详细说明了你怎么做你所要求的,还包含了很好的建议,你如何将你的构建版本与你的CI服务器联系起来。

概括地说,这里的要点:

  1. Maven的版本是缓慢的,需要做更快
  2. 您parametarize项目版本一样

    <version>${VERSION_NUMBER}</version> 
    ... 
    <properties> 
    ... 
        <VERSION_NUMBER>1.0-SNAPSHOT</VERSION_NUMBER> 
    ... 
    </properties> 
    
  3. 本地编译得到该版本:1.0-SNAPSHOT
  4. 发布版本完成只有从您的CI服务器
  5. 在你詹金斯/哈德逊项目配置使用

    clean deploy scm:tag -DVERSION_NUMBER=${BUILD_NUMBER} 
    

这样,你得到每个詹金斯新版本打造,不仅夜间。


您可以更改配置文件来使用

clean deploy scm:tag -DVERSION_NUMBER=1.0.0-CI-NIGHTLY-BIULD-${BUILD_ID} 

,你会得到类似的版本1.0.0-CI-NIGHTLY-BIULD-2012-04-26_12-20-24

+0

好极了!很有用 ! – Chucky 2012-09-26 11:02:07

2

我想你也可以使用versions Maven插件。我发现它对于这样的事情非常有用。

你可以做2个步骤:

  1. 设置必要的版本:mvn versions:set -DnewVersion=CI-NIGHTLY-BIULD-20120426
  2. 部署:mvn deploy
  3. 的情况下,你需要恢复的变化,使用mvn versions:revert(马克建议)
+1

您可以添加第3步,使POM恢复到原始状态:“mvn versions:revert” – 2012-04-27 19:53:57

+1

@ MarkO'Connor您说得对,我编辑了我的答案以包含此详细信息。 – 2012-04-28 07:14:35

相关问题