2010-07-21 125 views
84

我想弄清楚如何組織很多(大約50+)maven2項目,以便他們可以部署到一箇中央連接庫。當使用mvn deploy目標,一個人需要指定目標的distributionManagement標籤是這樣的:如何指定maven的分發管理組織範圍?

<distributionManagement> 
    <repository> 
     <id>nexus-site</id> 
     <url>http://central_nexus/server</url> 
    </repository> 
</distributionManagement> 

現在,我不希望每一個pom.xml的(那些50歲以上的)超過包含該數據塊並重新開始。我的第一個雖然將settings.xml文件,但它似乎不可能(在設計上)在那裏定義它。 所以,第一個問題是,爲什麼是這種情況?如果可以的話,我可以在maven2發行版的settings.xml中指定它,它可以分發給所有開發者。

我發現的唯一可能的解決方案是創建一個組織範圍的master-pom項目,該項目包含這些設置,並使所有其他pom.xml通過<parent>標記取決於此master-pom。但是,這看起來有點怪多模塊構建中:

- master configuration POM (pm) 
- Project 1 parent pom (p1 with module 1 and module 2 as modules) 
    - Project 1 module pom (with pm as parent) 
    - Project 2 module pom (with pm as parent) 

通常我該模塊勁歌應該使用父POM,而不是一些不同的一個所有文檔中讀取。但在閱讀關於繼承與聚合的maven網站之後,寫道它的確是可行的。

一個問題我發現了與Maven站點的一代,似乎有與此設置問題(模塊不能正確連接,如果他們沒有直接回引)

所以,這是一個有效的方法?任何其他更明顯,更簡單的解決方案?

+1

http://maven.apache.org/pom.html#Distribution_Management – OhadR 2014-07-23 11:08:05

+4

@OhadR:他們只寫如何寫在一個項目中。要點是我不想重複它約500次... – mglauche 2014-07-23 13:45:00

+1

我明白了。採取點。所以回答的人說,你可以有一個主要的POM爲項目,這將包含'distribMngmnt'... – OhadR 2014-07-24 10:42:45

回答

124

最好的解決方案是爲您的組織中的所有項目創建一個簡單的父pom文件項目(包裝'pom')。

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>your.company</groupId> 
    <artifactId>company-parent</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <distributionManagement> 
     <repository> 
      <id>nexus-site</id> 
      <url>http://central_nexus/server</url> 
     </repository> 
    </distributionManagement> 

</project> 

這可以構建,發佈,並部署到您的本地連結,所以每個人都可以訪問它的神器。

現在對於你想使用它的所有項目,只是包括本節:

<parent> 
    <groupId>your.company</groupId> 
    <artifactId>company-parent</artifactId> 
    <version>1.0.0</version> 
</parent> 

該解決方案將讓您輕鬆添加其他常用的東西貴公司的所有項目。例如,如果您想將您的JUnit使用標準化爲特定版本,那麼這將是完美的地方。

如果您有使用具有自己父級的多模塊結構的項目,Maven還支持鏈接繼承,因此,將項目的父級文件引用到您公司的父級pom並讓項目的子模塊不可用甚至知道你的公司的父母。

我從您的示例項目結構中看到,您試圖將您的父項目放在與聚合器pom相同的級別。如果您的項目需要自己的父項,我發現的最好方法是將父項包含在與其餘模塊相同的級別中,並將您的aggregator pom.xml文件放在所有模塊目錄所在的根目錄下。

- pom.xml (aggregator) 
    - project-parent 
    - project-module1 
    - project-module2 

你這個結構做的是包括你的父母模塊中的聚合,並建立一切以從根目錄「MVN安裝」。

我們在我的組織中使用了這個確切的解決方案,它經受住了時間的考驗,爲我們工作得非常好。

+2

我不知道鏈接繼承,好點! – mglauche 2010-07-22 07:49:56

+0

這裏是另一個我更詳細地描述項目繼承的答案,以及如何管理它的繼承複雜性,赦免雙關語。 ;)http://stackoverflow.com/questions/6347913/ – 2011-06-14 22:02:26

+7

只是一個小紙條:出於原因*爲什麼*公司父母是最好的解決方案,請參閱討論[無法在settings.xml中指定distributionManagement](http ://maven.40175.n5.nabble.com/Can-t-specify-distributionManagement-in-settings-xml-td3181781.html)來自Maven用戶的列表。 – 2011-10-21 10:10:49