web-dev-qa-db-ja.com

Mavenプロジェクトに複数の親を持つことができますか?

JavaおよびFlexプロジェクト。現在、両方のプロジェクトに使用する設定を含む1つの基本POMがあります。これに関する問題は、Flexプロジェクトがjavadocおよびpmdプラグイン。これは望ましくありません。

私はそれをきれいにして、本当のベースポンムとJava-base-pomおよびflex-base-pom。しかし、これはFlex部分とJava部分の両方を持つマルチモジュールでどのように機能しますか?

次の構造を使用する独自のアプリケーションへのプラグインがあります。

  • my-plugin
    • my-plugin-client(flex)
    • my-plugin-server(Java)

my-pluginに含まれるのはpom.xml with <modules/> セクション。私は使うだろう my-plugin pom.xmlを両方の親として使用しますが、Java base-pomまたはflex base-pomを親として使用することもできません。これに最適な方法は何ですか?

56
Wim Deblauwe

プロジェクトには1つの親しか持てません(C++の多重継承とは異なります)が、この親はより大きな親階層の一部になることができます。他の人が指摘したように、こうして次のようなものを持つことができます。

 base-pom /
 |-flex-base-pom 
 | |-my-plugin-client 
 | | `-pom.xml 
 | `-pom.xml 
 |-Java-base-pom 
 | |-my-plugin-server 
 | | `-pom.xml 
 | `-pom.xml 
`-pom.xml 

そうは言っても、実際の問題は次のように書いていることに気付きました。

flexプロジェクトは、たとえばjavadocやpmdの設定を継承しますが、これらは必要ありません。

この状況を回避するには、 pluginManagement 要素を使用する必要があります。

pluginManagementは、サイドプラグインに沿って表示される要素です。プラグイン管理には、この特定のプロジェクトビルドのプラグイン情報を構成するのではなく、このプロジェクトビルドを継承するプロジェクトビルドを構成することを除いて、ほぼ同じ方法でプラグイン要素が含まれます。ただし、これは、実際には子のplugins要素内で参照されるプラグインのみを構成します。子には、pluginManagement定義をオーバーライドするすべての権利があります。

そのため、親pomでは、pluginManagementでプラグインを構成し(たとえばjavadocおよびpmd)、目的の子のplugins要素内で参照します(ここのmy-plugin-serverのみ) )。これで現在の問題が解決します。

33
Pascal Thivent

Mavenプロジェクトには単一の親がありますが、次のような他のpomをいくつでもインポートできます。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>my-shared-dependencies</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

これには、親と比較して2つの重要な違いがあります。

  1. インポートされたPOMで定義されたプラグインはインポートされません
  2. インポートされたPOMで定義された依存関係は、現在のPOMに追加されません依存関係管理セクションに依存関係のみをインポートします

ただし、親pomに<dependencies>セクションがあり、それらを依存関係に含める場合は、通常の依存関係と同様に、依存関係セクションに親を追加できます。

<dependency>
    <groupId>org.example</groupId>
    <artifactId>my-shared-dependencies</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

同じ依存関係が既にインポートされている場合でも、バージョンタグを再度指定する必要があります。重複を減らすために、プロパティに保存できます

26
Peter Szanto

唯一の方法は、base-pomをJava-base-pomおよびflex-base-pomの親として持つことです。

私は私の春のプロジェクトに似た構造を持っています:

base-pom (basic configuration - Eclipse, reports, repositories, etc)
|
+ spring-base-pom (spring definitions)
  |
  + spring-jar-base-pom (jar specific definitions)
  |
  + spring-war-base-pom (spring web and servlet dependencies)
    |
    + spring-webapp-base_pom (spring web mvc dependencies)
6

私もこの正確な問題を越えており、私が見つけた最良の解決策は、この質問で示唆されているように継承と集計を使用することでした: Mavenは複数の親(複数の継承)をサポートしますか?

集約するプロジェクトの親ではないアグリゲーターpomを持つことができます。

Mavenドキュメント で説明します

継承と集約は、単一の高レベルPOMを介してビルドを制御するNiceダイナミックを作成します(...)逆に、POMプロジェクトは、それを継承しないプロジェクトを集約する場合があります。

これから、POMの継承を取得しました(pom-masterにはコミューン構成が含まれ、各子には詳細な構成が含まれます)。

 pom-master 
 |-pom-Java 
 |-pom-flex 

そして、私のプロジェクトは希望どおりに各モジュール構成の詳細を取得できます:

 project(project-flexとproject-Javaの集約)
 |-project-Java 
 | `-pom.xml => parent = pom-Java 
 |-project-flex 
 | `-pom.xml ==> parent = pom-flex 
`-pom.xml => parent = pom-master 
 

他の人にも役立つことを願っています:)

4
LE GALL Benoît

pom.xmlが実際にJavaクラス:親を1つだけ持つ(またはクラスを拡張する)ことができますが、この親は別の親を持つこともできます。

here で説明したように、Mavenの親と集約の原則を区別する必要があります。つまり、my-pluginは集約プロジェクトとして考えられ、必ずしもmy-plugin-clientとmy-plugin-parent。

要約すると:

my-pluginは、すべてのプロジェクトのベースpomを定義します。次に、2つの新しいpomプロジェクトを作成します:Java-base-pomおよびflex-base-pom。親としてmy-pluginの両方があります。これで、my-plugin-serverはJava-base-pomを親として持ち、my-plugin-serverはflex-base-pomを親として使用します。

このように、my-plugin-clientはmy-plugin pom.xmlで定義されているすべてのプロパティを継承し、Java-base-pomプロジェクトからも継承します。

2
Romain Linsolas

プロファイルを使用して複数の継承を実現できます。

ルートPOMで(複数の)プロファイルを作成し、これらのプロファイルのバリエーションを自動アクティブ化すると、Maven構成の多重継承が実現します。

0
sibidiba