2009-09-02 42 views
5

在我們的Maven項目,我們正在嘗試以下目錄結構(具有約80個項目總共只有少數顯示,讓你的想法):Maven的重用勁歌

myappli  (pom) 
-- module1  (pom) 
--|-- utils (pom) 
--|-- ejb  (pom) 
--|--|-- myappli-module1-a-ejb (jar) 
--|--|-- myappli-module1-b-ejb (jar) 
--|-- war  (pom) 
--|-- applet  (pom) 
... 
-- module6  (pom) 
--|-- utils  (pom) 
--|-- ejb  (pom) 
--|--|-- myappli-module6-c-ejb (jar) 
--|-- war  (pom) 
--|-- applet  (pom) 

注意:這是一個平坦結構對Maven,因爲所有的非葉項目具有「POM」一個packaging值。 (參見BetterBuildsWithMaven書)。

我們在「myappli」pom中定義了「dependencyManagement」中的依賴項版本。這工作正常。

我們的問題是與自己相依的重用。 例如,EJB依賴通用於所有EJB項目(由設計)。 我們不想cut'n貼,並保持所有以每個變化!

我們正在考慮爲ejb依賴性使用一些「導入概念」,並且在應用程序級別定義我們的ejb依賴關係。我們不成功的嘗試是:

  • Maven的「parent pom」的概念就可以了,但它已經使用的模塊,所以它不適用於我們的要求。
  • 在Maven中找不到任何導入工具(依賴管理除外)
  • 無法識別XML實體定義。我們嘗試了類似下面的POM,並得到了錯誤
    Reason: Parse error reading POM. Reason: could not resolve entity named 'ejbDependencies'」:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE project [
    <!ENTITY ejbDependencies SYSTEM "./ejbDependencies.txt">
    ]>
    <project ...
    ...
    &ejbDependencies;
    ...


編輯:我正在嘗試羅伯特建議的解決方案,但有些地方是錯誤的。

當我編譯我的EJB項目,它沒有找到依賴自己。編譯時(mvn編譯),我得到一個錯誤,說javax.ejb包缺失。

注意:我之前在依賴項目上運行過「mvn install」。

這是我的配置:

<project ...> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>com.company</groupId> 
    <artifactId>myproj-maven</artifactId> 
    <version>3.1-SNAPSHOT</version> 
    </parent> 

    <groupId>com.company</groupId> 
    <artifactId>myproj-maven-ejb</artifactId> 
    <version>${myproj-version}</version> 
    <packaging>pom</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>javax.ejb</groupId> 
     <artifactId>ejb</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>ojdbc</groupId> 
     <artifactId>ojdbc</artifactId> 
    </dependency> 
    </dependencies> 
</project> 

--------------------------------- 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
    <groupId>com.company</groupId> 
    <artifactId>myproj-identite-ejb</artifactId> 
    <version>3.1-SNAPSHOT</version> 
    </parent> 

    <groupId>com.company</groupId> 
    <artifactId>myproj-identite-metier</artifactId> 
    <name>SNR IDENTITE METIER</name> 
    <version>2.0.1</version> 
    <packaging>ejb</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.company</groupId> 
     <artifactId>myproj-maven-ejb</artifactId> 
     <version>${myproj-version}</version> 
     <type>pom</type> 
    </dependency> 
    </dependencies> 
</project> 

我不知道這是否改變了一些東西,但我們有涉及這兩個勁歌一個層次。
我們有一個嚴格的Maven結構,其中每個目錄將所有子目錄聲明爲maven模塊,並且每個子目錄都將父級聲明爲母版父級。
而常見的父目錄是這個結構的一部分。

+---maven 
| \---ejb 
+---identite 
| +---ejb 
| | \---SNR_IDENTITE_METIER 

編輯

由珊瑚礁給出的答案似乎是正確的。這是不可能與Maven做,因​​爲提供的依賴,因此不:-(

及物我們確實有很多問題,設置了Maven的。因此,許多小東西就是不工作。今天,我發現!出該網站的目標無法處理性能,我們使用的版本號

回答

2

您的進口依賴項有提供範圍嗎? 事實上,這個範圍不是傳遞的(參見Maven Dependency Scopes)。

這可能是未更換的原因。

+0

+1確實是這樣的原因,一個小測試證明了它。謝謝。 – KLE 2009-09-03 14:10:31

9

您可以使用POM依賴進口依賴到任意項目

一個POM項目可以類似於:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example</groupId> 
    <artifactId>persistence-deps</artifactId> 
    <version>1.0</version> 
    <packaging>pom</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate</artifactId> 
     <version>${hibernateVersion}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>${hibernateAnnotationsVersion}</version> 
    </dependency> 
    </dependencies> 
</project> 

,並導入爲:

<dependency> 
    <groupId>com.example</groupId> 
    <artifactId>persistence-deps</artifactId> 
    <version>1.0</version> 
    <type>pom</type> 
</dependency> 

詳見Maven, the definitive guide - Grouping Dependencies

+0

+1對於看起來很完美的答案。我正在嘗試它。 (注意:幾分鐘前,您還在另一個答案中編輯了我的「錯字」;-)) – KLE 2009-09-02 12:16:20

+0

我試過了。我在依賴項目上運行「mvn install」。然後我編譯我的ejb項目,它本身沒有找到依賴關係。 – KLE 2009-09-03 11:46:40

+0

爲了檢查,我運行了一個help:effective-pom。它不會替換依賴關係集的依賴關係。這是正常的嗎?我怎麼能檢查我的錯在哪裏? – KLE 2009-09-03 11:47:58