2013-10-16 66 views
11

我不確定是否瞭解如何正確使用父pom項目。我有以下父POM定義:Maven:添加對父pom項目的引用

<modelVersion>4.0.0</modelVersion> 
<groupId>com.example</groupId> 
<artifactId>parent</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>pom</packaging> 

<modules> 
    <module>../child1</module> 
    <module>../child2</module> 
</modules> 

這時孩子們POM引用父(每個孩子都有自己的一套依賴未圖示):

<parent> 
    <groupId>com.example</groupId> 
    <artifactId>parent</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <relativePath>../Parent/pom.xml</relativePath> 
</parent> 

<modelVersion>4.0.0</modelVersion> 
<artifactId>child1</artifactId> 

這種設置工作正常,在eclipse(m2eclipse)中正確解析。我可以部署這些對我的本地庫,並與下面的結構,這應該是正確的結束:

--com 
    --example 
     --parent 
     --0.0.1-SNAPSHOT 
      --parent-0.0.1-SNAPSHOT.pom 
     --child1 
     --0.0.1-SNAPSHOT 
      --child1-0.0.1-SNAPSHOT.jar 
      --child1-0.0.1-SNAPSHOT.pom 
     --child2 
     --0.0.1-SNAPSHOT 
      --child2-0.0.1-SNAPSHOT.jar 
      --child2-0.0.1-SNAPSHOT.pom 

我的問題是,我現在要引用的項目在不同項目(不父母,孩子1或孩子2),從而吸引父母的所有孩子。我可以在其他項目的引用添加到它:

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>parent</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <type>pom</type> 
    </dependency> 
</dependencies> 

在做這個項目展示了在Eclipse中沒有錯誤,但沒有文物被添加到我的類路徑:不child1,的child2,或任何其依賴關係。

我一直在想,必須有一個「主」POM項目的方式,它本身不是一個罐子,但只有引用其他罐子,然後能夠在某處引用該「主」,但我不能瞭解這是如何完成的。

回答

0

嘗試創建一個具有相同包裝類型的超級pom,並將您當前的父級添加爲依賴項。

11

我會建議改變你的項目結構的第一件事。

--com 
    --example 
     --parent 
     --0.0.1-SNAPSHOT 
      --parent-0.0.1-SNAPSHOT.pom 
     --child1 
     --0.0.1-SNAPSHOT 
      --child1-0.0.1-SNAPSHOT.jar 
      --child1-0.0.1-SNAPSHOT.pom 
     --child2 
     --0.0.1-SNAPSHOT 
      --child2-0.0.1-SNAPSHOT.jar 
      --child2-0.0.1-SNAPSHOT.pom 

我建議去以下方式:

--parent (pom.xml) 
     +--child1 
     +--child2 

家長可以在簽入到版本控制(GIT,SVN)或者到主或進入樹幹。除此之外,所有孩子的需要引用父是這樣的:

<modelVersion>4.0.0</modelVersion> 

<parent> 
    <groupId>com.example</groupId> 
    <artifactId>parent</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</parent> 

<artifactId>child1</artifactId> 

,並在你的父母,你可以使用這樣的事情:

<groupId>com.example</groupId> 
<artifactId>parent</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>pom</packaging> 

<modules> 
    <module>child1</module> 
    <module>child2</module> 
</modules> 

此外,你還可以通過添加使用公司POM只是單純家長參考項目父:

<parent> 
    <groupId>com.example</groupId> 
    <artifactId>master-pom</artifactId> 
    <version>0.0.1</version> 
</parent> 

<groupId>com.example</groupId> 
<artifactId>parent</artifactId> 
<version>0.0.1-SNAPSHOT</version> 
<packaging>pom</packaging> 

<modules> 
    <module>child1</module> 
    <module>child2</module> 
</modules> 

在公司POM你可以(也應該)引腳不同的插件版本,並確定公司違約和建議具有依賴性他們的適當版本。

如果你喜歡有一個公司的超級POM,你可以簡單地創建一個單獨的Maven項目,其中只包含包含你的配置,如插件,依賴關係等的POM文件,當然也可以將它檢入版本控制(Git,SVN等)。 )。與其他項目分開。

如果您想引用一個jar文件,這意味着換句話說,您的多模塊構建的工件,您必須使用正確的groupId,artifactId和版本。如果你喜歡在其他項目中使用child1你需要給出如下:

<dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>child1</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </dependency> 
</dependencies> 

明白,一個多模塊構建的父母不是,它是常用的神器是很重要的,原因基於包裝類型pom它並不真正創建工件(jar文件)。

更新: 你可以做,以有限的方式僅適用於使用scope import的dependencyManagement區域,但這僅用於使用在depdencyManagement而不是依賴。 另一種解決方案可能是創建一個獨立的虛擬項目,它具有兩個子項作爲傳遞層次的依賴關係。但這並非真正的美麗。

所以解決方案只是直接添加兩個或更多的依賴關係,你在項目中使用的就是這樣。

+2

你最後兩段讓我覺得我不瞭解我如何使用父pom。儘管我使用共享所有子模塊共享的依賴關係,但我確實需要一個依賴關係,我可以將其添加到其他項目中,這些項目將引入不相關但相關的「子項」。我想添加一個依賴項,它將引入_child1_和_child2_。 – trebor

+0

@trebor家長POM不是那個。要創建元項目,請創建一個名爲「common-libraries」的常規Maven項目,並將所有其他項目作爲依賴項引用。父POM是一步構建多個庫,並自動使用正確的構建順序。 –

0

正如@khmarbaise所指出的那樣,多模塊構建的父代通常不會用作其他地方的依賴項。

您應該可以將每個子模塊添加爲依賴關係,並通過添加父pom來實現您想要執行的操作。

+0

這就是我試圖用父pom實現的...我想要一個單獨的依賴項,我可以添加它將拉動其他相關但不相關的工件。意思是,我希望_child1_和_child2_在一個單獨的項目中,但不想將兩者都定義爲依賴關係。 – trebor

+1

聽起來我試圖定義一種Maven中不存在的包含文件。您正在使用的每個依賴項都應聲明爲明確的。另一方面,dependencyManagement部分有意將其版本的依賴性定義爲在較大的組織中用作建議。但是如果你真的想使用依賴關係,你必須將它寫入你的項目的pom(除了版本)。 – khmarbaise