74

JavaプロジェクトとFlexプロジェクトがあります。現在、両方のプロジェクトに使用する構成を含む1つのベースpomがあります。これに関する問題は次のとおりです。Flexプロジェクトはjavadocpmdプラグインなどの構成を継承しますが、これは望ましくありません。

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

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

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

my-pluginpom.xmlwith<modules/>セクションが含まれているだけです。両方の親としてpom.xmlを使用しますmy-pluginが、javabase-pomまたはflexbase-pomを親として使用することもできません。これに対する最善のアプローチは何でしょうか?

4

6 に答える 6

43

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>依存関係に含めたい場合は、通常の依存関係と同じように親をセクションに追加できます。<dependencies>

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

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

于 2016-08-26T07:21:31.530 に答える
40

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

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のみ)。これで現在の問題が解決します。

于 2009-10-28T14:19:57.877 に答える
6

唯一の方法は、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)
于 2009-10-28T12:17:09.703 に答える
4

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

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

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

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

これから、POMを継承しました(pom-masterにはコミューン構成が含まれ、各子には特定の構成が含まれています):

pom-master
  |-pom-java
  |-pom-flex

そのため、私のプロジェクトでは、必要に応じて各モジュール構成の詳細を取得できます。

プロジェクト(集約プロジェクト-フレックス&プロジェクト-Java)
  |-project-java
  | `-pom.xml=>親=pom-java
  |-プロジェクトフレックス
  | `-pom.xml==>親=pom-flex
  `-pom.xml=>親=pom-master

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

于 2012-11-12T14:14:27.200 に答える
3

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

ここで説明したように、Mavenの親と集約の原則を区別する必要があります。つまり、my-pluginは集約プロジェクトと見なされ、必ずしもmy-plugin-clientとmy-plugin-parentの両方の親プロジェクトとは見なされません。

要約すると:

my-pluginすべてのプロジェクトのベースpomを定義します。次に、2つの新しいpomプロジェクトを作成します:java-base-pomflex-base-pom。彼らは両方ともmy-plugin親として持っています。これで、my-plugin-clientがjava-base-pom親として使用され、my-plugin-serverがflex-base-pom彼の親として使用されます。

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

于 2009-10-28T12:16:24.727 に答える
0

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

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

于 2012-12-21T00:26:21.093 に答える