JavaおよびFlexプロジェクト。現在、両方のプロジェクトに使用する設定を含む1つの基本POMがあります。これに関する問題は、Flexプロジェクトがjavadoc
およびpmd
プラグイン。これは望ましくありません。
私はそれをきれいにして、本当のベースポンムとJava-base-pom
およびflex-base-pom
。しかし、これはFlex部分とJava部分の両方を持つマルチモジュールでどのように機能しますか?
次の構造を使用する独自のアプリケーションへのプラグインがあります。
my-plugin
に含まれるのはpom.xml
with <modules/>
セクション。私は使うだろう my-plugin
pom.xmlを両方の親として使用しますが、Java base-pomまたはflex base-pomを親として使用することもできません。これに最適な方法は何ですか?
プロジェクトには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のみ) )。これで現在の問題が解決します。
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つの重要な違いがあります。
ただし、親pomに<dependencies>セクションがあり、それらを依存関係に含める場合は、通常の依存関係と同様に、依存関係セクションに親を追加できます。
<dependency>
<groupId>org.example</groupId>
<artifactId>my-shared-dependencies</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
同じ依存関係が既にインポートされている場合でも、バージョンタグを再度指定する必要があります。重複を減らすために、プロパティに保存できます
唯一の方法は、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)
私もこの正確な問題を越えており、私が見つけた最良の解決策は、この質問で示唆されているように継承と集計を使用することでした: 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
他の人にも役立つことを願っています:)
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
プロジェクトからも継承します。
プロファイルを使用して複数の継承を実現できます。
ルートPOMで(複数の)プロファイルを作成し、これらのプロファイルのバリエーションを自動アクティブ化すると、Maven構成の多重継承が実現します。