web-dev-qa-db-ja.com

Maven:親pomプロジェクトへの参照の追加

親pomプロジェクトを正しく使用する方法を理解しているかどうかはわかりません。次の親POMが定義されています。

<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>../child1</module>
    <module>../child2</module>
</modules>

そして、子pomは親を参照します(各子には、示されていない独自の依存関係セットがあります)。

<parent>
    <groupId>com.example</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../Parent/pom.xml</relativePath>
</parent>

<modelVersion>4.0.0</modelVersion>
<artifactId>child1</artifactId>

このセットアップは正常に機能し、Eclipse(m2Eclipse)で正しく解決されます。これらをローカルリポジトリにデプロイすると、次の構造になります。これは正しいはずです。

--com
   --example
      --parent
        --0.0.1-SNAPSHOT
          --parent-0.0.1-SNAPSHOT.pom
      --child1
        --0.0.1-SNAPSHOT
          --child1-0.0.1-SNAPSHOT.jar
          --child1-0.0.1-SNAPSHOT.pom
      --child2
        --0.0.1-SNAPSHOT
          --child2-0.0.1-SNAPSHOT.jar
          --child2-0.0.1-SNAPSHOT.pom

私の問題は、異なるプロジェクト(親、子1、または子2ではない)でプロジェクトを参照し、親のすべての子をプルしたいということです。他のプロジェクトで参照を追加できます。

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>pom</type>
    </dependency>
</dependencies>

これを行うと、プロジェクトにはEclipseでエラーは表示されませんが、child1、child2、またはそれらの依存関係ではなく、アーティファクトがクラスパスに追加されません。

Jarではなく、他のjarへの参照のみを持ち、どこかでその「マスター」を参照できる「マスター」pomプロジェクトを作成する方法があるに違いないと思っていますが、どのようにこれを見つけることができません達成されます。

14
trebor

プロジェクトの構造を変更することを最初に提案します。

--com
   --example
      --parent
        --0.0.1-SNAPSHOT
          --parent-0.0.1-SNAPSHOT.pom
      --child1
        --0.0.1-SNAPSHOT
          --child1-0.0.1-SNAPSHOT.jar
          --child1-0.0.1-SNAPSHOT.pom
      --child2
        --0.0.1-SNAPSHOT
          --child2-0.0.1-SNAPSHOT.jar
          --child2-0.0.1-SNAPSHOT.pom

私は次の道を行くことをお勧めします:

  --parent (pom.xml)
      +--child1
      +--child2

親は、マスターまたはトランクのいずれかでバージョン管理(Git、SVN)にチェックインできます。それとは別に、すべての子は次のように親を参照する必要があります。

<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>com.example</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>child1</artifactId>

そしてあなたの親では次のようなものを使用できます:

<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>child1</module>
    <module>child2</module>
</modules>

さらに、プロジェクトの親に親参照を追加するだけで、会社のポンムを使用できます。

<parent>
    <groupId>com.example</groupId>
    <artifactId>master-pom</artifactId>
    <version>0.0.1</version>
</parent>

<groupId>com.example</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>child1</module>
    <module>child2</module>
</modules>

会社のpomでは、さまざまなプラグインバージョンを固定し、適切なバージョンで会社のデフォルトと依存関係の提案を定義できます(また、そうすべきです)。

会社のスーパーポンムが好きな場合は、プラグイン、依存関係などの設定を含むpomファイルのみを含む別のmavenプロジェクトを作成し、もちろんバージョン管理(Git、SVNなど)にチェックインします。他のプロジェクトとは別に。

言い換えると、マルチモジュールビルドのアーティファクトを意味するjarファイルを参照する場合は、正しいgroupId、artifactId、およびバージョンを使用する必要があります。他のプロジェクトでchild1を使用する場合は、以下を提供する必要があります。

<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>child1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

マルチモジュールビルドの親は通常使用されるアーティファクトではないことを理解することが重要です。原因はパッケージタイプpomに基づいているため、実際にはアーティファクト(jarファイル)は作成されません。

Update:scope import を使用して、dependencyManagementエリアに対してのみ限定的な方法でそれを行うことができますが、これは、依存関係ではなくdepdencyManagementでの使用のみを目的としています。他の解決策は、推移的な依存関係として2つの子が依存しすぎる別のダミープロジェクトを作成することです。しかし、これは本当に美しいものではありません。

したがって、解決策は、プロジェクトで使用している2つ以上の依存関係を単純に追加するだけです。

14
khmarbaise

同じパッケージタイプのスーパーポンを作成して、現在の親を依存関係として追加してみてください。

0
MikeW

@khmarbaiseが指摘したように、マルチモジュールビルドの親は通常、他の場所で依存関係として使用されません。

子モジュールのそれぞれを依存関係として追加し、親pomを追加することで目的を達成できる必要があります。

0
Raghuram