2012-04-26 85 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

相關問題