2014-02-12 179 views
3

我開始學習maven,現在我正在嘗試開始一些簡單的realworld項目。也許它在這裏看起來很簡單,但如果我想同時打包父項目和子項目,我該怎麼辦,我真的很困惑。用Maven繼承和構建

(PS:我使用的BTW的IntelliJ IDEA)

這裏是我的配置

項目A

  • 認爲這取決於番石榴和GSON

B計劃

  • 它將取決於項目A

項目C

  • 它將取決於項目B
  • 當我設置包裝項目A的屬性到罐子

,它提供了一個錯誤基本上是這樣說的:「如果包裝元素在父類中,你必須將包裝元素設置爲pom」。但我知道,如果我將包裝元素設置爲pom,則不會創建包裝。

因此,我決定創建另一個項目作爲multimodule來管理包裝問題,但不知道如何!我怎樣才能同時爲他們每個人生成jar文件?

編輯 - 這裏是我DID

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

    <groupId>com.deneme.module</groupId> 
    <artifactId>ModuleGroup</artifactId> 
    <packaging>pom</packaging> 
    <version>1.0.1</version> 
    <modules> 
     <module>A</module> 
     <module>B</module> 
    </modules> 


</project> 

項目

<?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.mg.A</groupId> 
    <artifactId>A</artifactId> 
    <version>1.0.2</version> 
    <packaging>pom</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>2.2.3</version> 
     </dependency> 
    </dependencies> 



</project> 

項目B

<?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> 
    <packaging>jar</packaging> 

    <parent> 
     <artifactId>A</artifactId> 
     <groupId>com.mg.A</groupId> 
     <version>1.0.2</version> 
     <relativePath>../A/pom.xml</relativePath> 
    </parent> 

    <groupId>com.mg.B</groupId> 
    <artifactId>B</artifactId> 
    <version>1.0.1</version> 

</project> 
+0

將與您項目進行建設什麼類型的文物,B a nd C?這三個項目如何構建 - B和C作爲A的子模塊還是所有頂級項目?也許發佈你的POM和目錄結構的相關部分。 –

+0

你的項目結構是什麼樣的?是B還是C的父母?如果是的話,這可能不是你想要的。你期望的結果是什麼(即應該是什麼結果 - 一個EAR文件?)。 如果所有三個「模塊」都在同一個「項目」中,您可以製作一個父 - 媽媽,將這三個模塊作爲孩子。 – MrD

+0

可以說所有這些應該是一個jar文件的結果。 A是B的父母,他們都是圖書館項目。 C是一個正常的項目,它將使用庫B(和間接方式A)。我不想一遍又一遍地描述依賴關係。例如,我必須定義項目A中的所有依賴項,並且C應自動使用它們中的所有依賴項。 –

回答

1

我想你混淆了繼承和依賴。

繼承:子pom繼承所有值,如屬性,groupId,版本,也依賴關係。一般來說,你不應該在父母勁歌使用依賴

依賴:一個POM依賴於其它一些JAR/POM和使用它的內容,並且也使用/取決於傳遞依賴

據我理解您的問題您具備以下條件:

  1. A計劃 - 根據像GSON和番石榴外部包庫
  2. 項目B - 庫根據項目B,並傳遞性上GSON和番石榴
  3. 項目C - 根據項目B的應用程序,並傳遞地對項目A,GSON和番石榴

我建議你使用這個目錄結構

Workspace 
|- ModuleProject 
|- ProjectA 
|- ProjectB 
\- ProjectC 

和勁歌會是什麼樣子此(報頭剝離):

模塊POM:

<groupId>com.deneme.projectname</groupId> 
<artifactId>ModuleGroup</artifactId> 
<packaging>pom</packaging> 
<version>1.0.1</version> 

<modules> 
    <module>../ProjectA</module> 
    <module>../ProjectB</module> 
    <module>../ProjectC</module> 
</modules> 

項目A:

<parent> 
    <groupId>com.deneme.projectname</groupId> 
    <artifactId>ModuleGroup</artifactId> 
    <version>1.0.1</version> 
    <relativePath>../ModuleProject/</relativePath> 
</parent> 

<artifactId>A</artifactId> 
<version>1.0.2</version> 
<packaging>jar</packaging> 

<dependencies> 
    <dependency> 
     <groupId>com.google.code.gson</groupId> 
     <artifactId>gson</artifactId> 
     <version>2.2.3</version> 
    </dependency> 
</dependencies> 

項目B:

<parent> 
    <groupId>com.deneme.projectname</groupId> 
    <artifactId>ModuleGroup</artifactId> 
    <version>1.0.1</version> 
    <relativePath>../ModuleProject/</relativePath> 
</parent> 

<artifactId>B</artifactId> 
<version>1.0.2</version> 
<packaging>jar</packaging> 

<dependencies> 
    <dependency> 
     <groupId>com.deneme.projectname</groupId> 
     <artifactId>A</artifactId> 
     <version>1.0.2</version> 
    </dependency> 
</dependencies> 

項目C:

<parent> 
    <groupId>com.deneme.projectname</groupId> 
    <artifactId>ModuleGroup</artifactId> 
    <version>1.0.1</version> 
    <relativePath>../ModuleProject/</relativePath> 
</parent> 

<artifactId>C</artifactId> 
<version>1.0.2</version> 
<packaging>jar</packaging> 

<dependencies> 
    <dependency> 
     <groupId>com.deneme.projectname</groupId> 
     <artifactId>B</artifactId> 
     <version>1.0.2</version> 
    </dependency> 
</dependencies> 
+0

我按你所說的做了,它的工作非常完美,非常感謝你,但我要求清楚地瞭解我們什麼時候需要使用繼承呢? –

+1

我編輯了我的答案,你這樣做是爲了消除冗餘:groupId通常是所有項目使用的相同的值或屬性。另一點是DependencyManagement:你可以在你的父Pom中定義一個依賴版本:讓我們來說說junit-4.11。每個使用junit作爲依賴項的子項自動使用版本號4.11(除非你指定else) –

+0

我完全理解,再次感謝,但是我腦海中還有另一個問題,讓我們假設我想在ProjectB中更改某個方法名但未編譯然後我建立項目C.通常在構建C之前,它必須構建B,因爲我們在項目C中聲明瞭依賴關係,但不知何故(我剛剛檢查過它),即使存在依賴關係,項目B也沒有編譯。我需要從上到下編譯問題。如何自動觸發編譯項目C時編譯項目B? –

2

如果您的項目A將B和C聲明爲模塊,則必須將包裝元素設置爲pom。這也意味着它不應該包含任何代碼,並且不會自行生成工件。這只是將項目組合在一起的一種方式。

在maven中,父pom用於定義將由所有子項目繼承的公共配置(屬性等)。

在你的情況我猜想,你需要一個父項目(POM包裝)與3名兒童:A,B和C:

parentProject 
* module A 
* module B 
* module C 

當運行MVN安裝上parentProject,所有子模塊會建立和生產相應的罐子(比如A.jar,B.jar和C.jar)。

請注意,您不需要在子pom中聲明父級以實現此結果,您只需將它們聲明爲父級pom中的模塊即稱爲項目聚合。在子項中聲明父項稱爲項目繼承。你可以看一下下面的文檔瞭解更多信息:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation