7

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

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

我们有一个 CI 系统,我们想要发布夜间构建,但没有使用-SNAPSHOT Maven 的解决方案,所以如果1.0.0是当前版本,我们只想拥有CI-NIGHTLY-BIULD-20120426.

我建议使用类似的东西可以做到这一点mvn deploy -Dversion=CI-NIGHTLY-BIULD-20120426,但显然不是。不好的解决方案是让 CI 服务器pom.xml每次都编辑,但我认为这很不方便。

谢谢!

4

4 回答 4

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文档说分类器:

分类器:你可能偶尔会在坐标上找到第五个元素,那就是分类器。我们稍后会访问分类器,但现在知道这些类型的项目显示为 groupId:artifactId:packaging:classifier:version 就足够了。

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

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

于 2012-04-26T10:24:20.723 回答
2

我认为您也可以使用版本Maven 插件。我发现它对这样的事情非常有用。

您可以分两步完成:

  1. 设置必要的版本:mvn versions:set -DnewVersion=CI-NIGHTLY-BIULD-20120426
  2. 部署:mvn deploy
  3. 如果您需要恢复更改,请使用mvn versions:revert(如 Mark 建议的那样)
于 2012-04-26T19:09:36.730 回答
1

我强烈推荐阅读Axel Fontaine 的Maven Releases on Steroids第 2部分,第 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. 在您使用的 Jenkins/Hudson 项目配置中

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

这样你就可以在每个 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

于 2012-04-26T11:36:43.770 回答
-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 不鼓励这样做。

于 2012-04-26T10:04:03.037 回答