2012-06-08 83 views
7

我有一個maven POM,我想用它作爲模板,根據我傳遞給它的參數來生成不同名稱的工件。但我無法弄清楚如何在運行時指定artifactId。我可以在運行時指定maven project.artifactId嗎?

如果我參數化<artifactId>元件是這樣的:

<artifact>foo-${bar}</artifact> 

行家抱怨:

[警告] '的artifactId' 包含的表達,但應該是一個常數。

如果我離開了在POM <artifactId>,並嘗試以

mvn -Dproject.artifactId=foo ... 

行家指定它在命令行上抱怨:

[錯誤] '的artifactId' 缺失。

除了訴諸從模板生成POM文件之外,還有其他的技巧可以用來完成這個嗎? [嗯,也許我可以做到這一點使用maven資源過濾...]

回答

5

如果我得到它的權利,你想重用一個藍圖maven應用程序,並能夠改變artifactId。

這個用例最好用Maven原型完成。見this to get you started。這是相當直接的,值得學習。你有你的普通Maven項目,並在藍圖pom中添加像${groupId}這樣的變量。然後,他們會被替換通過在原型生成由你給出的參數:

mvn archetype:generate         \ 
-DarchetypeGroupId=<archetype-groupId>    \ 
-DarchetypeArtifactId=<archetype-artifactId>   \ 
-DarchetypeVersion=<archetype-version>    \ 
-DgroupId=<my.groupid>        \ 
-DartifactId=<my-artifactId> 

也有很多的人在GitHub上,你可以瞭解更多關於構建和篩選在Maven原型For example創建原型。

或者,您可以嘗試設置Maven過濾而不使用原型系統,但我對此沒有經驗。我認爲如果沒有一個有效的artifactId,你就不能運行一個項目,有些世代必須在此之前發生(比如從原型生成),但我不確定。

+0

謝謝,這看起來很合適。似乎每個Maven問題都有「這是一個插件」形式的答案:-)。我懷疑我的使用Maven過濾的想法最終會變成一個窮人的原型,所以使用經過驗證的東西而不是重新發明輪子是有道理的。 –

+0

我同意原型是要走的路,但它並沒有真正回答這個問題。即使這是一個完全不好的做法,是否可以在運行時設置artifactId? – dokaspar

0

您將違背maven原則,即pom可能代表一個自成一體的項目,生成穩定的工件(即避免無法輕鬆再現的參數化構建)。

如果這真的是你想要的,我會使用maven-install-plugin作爲生命週期步驟(特別是安裝文件)和參數化,而不是嘗試參數化pom本身的artifactId。

+0

感謝您的反饋。我的構建已經有些參數化了(考慮到它的內置支持從命令行,環境等獲取屬性,Maven似乎並沒有過多地阻止它)。但我肯定是一個maven新手。我需要做的是採取一個「工廠」項目,並建立它的許多變化,只是略有不同,產生不同的文物。我會看看安裝文件。 –

相關問題