有没有办法从命令行配置Maven POM的版本?

时间:2012-04-26 09:57:50

标签: java maven continuous-integration maven-3

有没有办法在不编辑POM的情况下更改版本号?

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

我们有一个CI系统,我们想要发布每晚构建,但不使用Maven的-SNAPSHOT解决方案,所以如果1.0.0是当前版本,我们只想拥有{{1} }。

我建议使用像CI-NIGHTLY-BIULD-20120426这样的东西,但显然不行。错误的解决方案是让CI服务器每次都编辑mvn deploy -Dversion=CI-NIGHTLY-BIULD-20120426,但我认为这非常不方便。

谢谢!

4 个答案:

答案 0 :(得分:7)

我建议使用分类器。

<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文档   以及打包的类文件。

答案 1 :(得分:2)

我认为你也可以使用versions maven插件。我发现它对这样的事情非常有用。

你可以分2步完成:

  1. 设置必要的版本:mvn versions:set -DnewVersion=CI-NIGHTLY-BIULD-20120426
  2. 部署:mvn deploy
  3. 如果您需要还原更改,请使用mvn versions:revert(正如Mark建议的那样)

答案 2 :(得分:1)

我强烈建议您阅读Axel Fontaine的Maven Releases on Steroidspart 2part 3)。这很棒,我很高兴使用它。

它不仅详细说明了您如何执行您的要求,还包含有关如何将构建版本与CI服务器绑定的良好建议。

简而言之,以下是要点:

  1. Maven发布缓慢,需要更快完成
  2. 您可以像

    那样对项目版本进行参数化
    <version>${VERSION_NUMBER}</version>
    ...
    <properties>
    ...
        <VERSION_NUMBER>1.0-SNAPSHOT</VERSION_NUMBER>
    ...
    </properties>
    
  3. 本地版本获得该版本:1.0-SNAPSHOT
  4. 发布版本仅从CI服务器
  5. 完成
  6. 在Jenkins / Hudson项目配置中,您使用

    clean deploy scm:tag -DVERSION_NUMBER=${BUILD_NUMBER}
    
  7. 通过这种方式,您可以获得每个Jenkins构建的新版本,而不仅仅是每晚。


    您可以更改配置以使用

    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

    等版本

答案 3 :(得分:-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不鼓励它。