2011-06-10 20 views
2

Env:Maven 2.2.1 我有兩個java項目下svn(projectA,projectB)。我的Maven的結構如下..如何定義組織特定的父pom

For projectA 
pom.xml (contains ProjectA parent pom definitions) 

    module moduleA 
    module moduleB 


For projectB 
pom.xml (contains ProjectB parent pom definitions) 

    module moduleC 
    module moduleD 

了projectA/pom.xml中和項目B/pom.xml中包含類似的JUnit,硒,編譯器,Eclipse插件這兩者共同項目共同的定義。 (例如下面給出)

<dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.4</version> 
     <type>jar</type> 
     <scope>compile</scope> 
    </dependency> 

    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.7</version> 
     <scope>test</scope> 
    </dependency 

我應該如何創建/組織機構具體項目POM,其中包括這樣的共同的定義,使個別項目不必重新建立/保持一個。有人可以提供一些已經做到這一點的片段或項目嗎?

EDIT1:

公司/ pom.xml的

<modelVersion>4.0.0</modelVersion> 

<groupId>com.mycompany</groupId> 
<artifactId>company</artifactId> 
<packaging>pom</packaging> 

<name>parent</name> 
<version>1.0.0</version> 

<build> 
    <defaultGoal>install</defaultGoal> 
</build> 

<dependencies> 
    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
     <version>2.4</version> 
     <type>jar</type> 
     <scope>compile</scope> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

了projectA/pom.xml的

<modelVersion>4.0.0</modelVersion> 

<parent> 
    <groupId>com.mycompany</groupId> 
    <artifactId>company</artifactId> 
    <version>1.0.0</version> 
</parent> 

<groupId>com.mycompany</groupId> 
<artifactId>projectA</artifactId> 
<packaging>pom</packaging> 

<name>projectA</name> 
<version>1.0.0</version> 

<modules> 
    <module>moduleA</module> 

<build> 
    <defaultGoal>install</defaultGoal> 
</build> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
</properties> 

了projectA/moduleA/pom.xml的

<modelVersion>4.0.0</modelVersion> 

<parent> 
    <groupId>com.mycompany</groupId> 
    <artifactId>projectA</artifactId> 
    <version>1.0.0</version> 
    <relativePath>../pom.xml</relativePath> 
</parent> 

<groupId>com.mycompany</groupId> 
<artifactId>moduleA</artifactId> 
<version>1.0.0</version> 
<packaging>jar</packaging> 

<name>moduleA</name> 

<build> 
    <finalName>moduleA</finalName> 
    <defaultGoal>install</defaultGoal> 
</build> 

<dependencies> 
    <dependency> 
     <groupId>commons-lang</groupId> 
     <artifactId>commons-lang</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
    </dependency> 
</dependencies> 

拋出以下錯誤:

Project ID: com.mycompany:moduleA 
POM Location: c:\temp\maven\projectA\moduleA\pom.xml 
Validation Messages: 

    [0] 'dependencies.dependency.version' is missing for commons-lang:comm 
ons-lang:jar 
    [1] 'dependencies.dependency.version' is missing for javax.servlet:ser 
vlet-api:jar 

回答

4

如果它只是你需要重用,創建包裝pom另一個項目,並有指定的依賴關係的依賴關係。我們將其稱爲OrgDependencies然後將其作爲依賴項包含在您的projectAprojectB中。它會傳遞從OrgDependencies項目的所有依賴關係。


在你的榜樣,在了projectA,而不是

<parent> 
    <groupId>com.mycompany</groupId> 
    <artifactId>company</artifactId> 
    <version>1.0.0</version> 
</parent> 

嘗試把

<dependencies> 
    <dependency> 
    <groupId>com.mycompany</groupId> 
    <artifactId>company</artifactId> 
    <version>1.0.0</version> 
    </dependency> 
</dependencies> 

而且從模塊中刪除依賴於公共琅等。


更新。

雖然我以前與傳遞依賴的解決方案應該工作,實際上你需要什麼 是在你的公司廣泛的pom.xml

<dependencyManagement>節這就是你定義的版本。

注:任何東西dependencyManagement節是不是一個真正的依賴性,而只是一個描述符,它允許的情況下,指定版本,並排除傳遞依賴(如有必要)正常dependencies部分指定的依賴。因此,您可以根據需要在dependencyManagement中放置儘可能多的物品,但不會讓所有的後代都依賴它們。

我測試了它和它的作品:

<?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/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.mycompany</groupId> 
    <artifactId>company</artifactId> 
    <packaging>pom</packaging> 

    <name>parent</name> 
    <version>1.0.0</version> 

    <build> 
     <defaultGoal>install</defaultGoal> 
    </build> 

    <dependencyManagement> 
     <dependencies> 
     <dependency> 
      <groupId>commons-lang</groupId> 
      <artifactId>commons-lang</artifactId> 
      <version>2.4</version> 
      <type>jar</type> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
      <version>2.5</version> 
      <scope>provided</scope> 
     </dependency> 
     </dependencies> 
    </dependencyManagement> 
</project> 
+0

我試過你的建議,但它無法拉動我的子模塊中的傳遞依賴 – Joe 2011-06-10 06:49:48

+0

你能提供具體細節嗎?你是如何設立你的父項目的?你是如何提及它的?什麼是錯誤?這種方法絕對適合我。 – 2011-06-10 06:55:56

+0

我已經完全按照下面的示例中所述完成了,唯一的區別是公司廣泛的pom包含所有依賴關係/版本。因此子模塊無法解析。如果項目pom中存在依賴關係/版本,則子模塊能夠解析依賴關係/版本 – Joe 2011-06-10 07:31:14

3

在OS項目,我通常使用3+水平多金屬氧酸鹽:狀分佈

  • 「全公司POM」包含開發範圍定義管理,個人插件版本等非常穩定,通常有一個號碼版本。例如:Sonatype OSS Parent
  • 「Project POM」包含項目範圍的定義:Java編譯器版本,依賴關係管理等。Parent是公司範圍的POM。例如:JAXB2 Basics Project。版本隨每個版本更新。
  • 「不同層次上的模塊POM」。列出各個依賴項(依賴項的版本從項目POM繼承),添加「特殊」構建步驟。例如:JAXB Basics

我看到了類似的模式,其他操作系統項目(如Apache的)也是如此。

一些更多的評論:

  • 您還可能有「部門POM」或取決於公司規模和產品組織的「產品POM」。
  • 認爲POM繼承與OOP繼承相當。你會在哪個抽象類中放入什麼,以便類層次結構穩定而動態?例如,在公司範圍的POM中定義依賴版本是沒有意義的,因爲版本變化太頻繁。相反,定義項目的分銷管理會損害DRY原則。
+0

我已經完全按照上面的示例中所述完成了,唯一的區別是公司廣泛的pom包含所有依賴關係/版本。因此子模塊無法解析。如果項目pom中存在依賴項/版本,則子模塊能夠解析依賴項/版本 – Joe 2011-06-10 07:28:46

5

我會認真考慮添加依賴變成了「超級」 POM,這種不必要的情侶項目(但可能會暗示,如果項目不是完全不同的,他們應該無論如何合併)。 我認爲@lexicore的最新評論也很刺激,爲了擴展OOP類比,它也像「混合抽象層次」一樣。

亞歷Gitelman提供正確的答案,你需要使用dependencyManagement如下所示Dependency Scope

Maven3是應該是支持POM片段看到How to use Maven 3 mixins?這是我早就一直在等待。

我們有一個組織尤伯杯POM但這恰恰包含:

<organization> 
    <name>...</name> 
    <url>...</url> 
</organization> 

<developers> 
    <developer> 
     <id>...<id> 
     <name>...</name> 
     <email>...</email> 
     <roles> 
      <role>...</role> 
     </roles> 
    </developer> 

<distributionManagement> 
    ... 
</distributionManagement> 

<repositories> 
    <!-- your proxy repo here --> 
</repositories> 

這些事情改變很少(如果我們改變我們的資料庫/配送管理,那麼所有項目必須改變,如果一個開發人員的葉子或加入我們可以隨時更新項目POMs)。

依賴關係特別屬於正在考慮的模塊,僅僅因爲兩個獨立的項目碰巧共享依賴關係現在並不意味着它們總是會這樣。我完全理解爲每個項目(編譯器插件,報表插件,junit等)複製'n'粘貼XML所帶來的煩惱,但是每個項目中不同級別的活動肯定意味着它們在某些時候會出現分歧。

WRT級聯構建持續集成,如果項目A需要在中超的變化相依POM,然後所有你的其他項目將被迫重建 - 如果你只有2個項目,但即使然後做你也許罰款結賬並在提交更改之前構建兩者?

相關問題