28

関連する一連の Maven プロジェクトを相互依存関係でセットアップするのに苦労しています。

これが私の単純化されたケースです:

pom.xml     -- parent pom
\base\
    pom.xml
    src\main\java\Base.java     -- this is just a simple class
\derived\
    pom.xml
    src\main\java\Derived.java  -- this is a simple class that needs Base class to compile successfully, and has a main function

私の目標は次のとおりです。

  1. 私のマシンで、すべてのプロジェクトをコンパイルできます。
    • つまりmnv clean compile、\ で成功します。
  2. 私のマシンで、1 つのプロジェクトだけをコンパイルできます。
    • つまりmnv clean compile、 \base\ および \built\ で成功します (ただし、これは設計上は機能しない場合があります: Inter Project Dependencies in Maven )
      [編集: この答えが見つかりました: base は、コンパイル済みで派生する前にローカルで公開する必要があります: つまり \基本、mvn clean compile installただするのではなく、するmvn clean compile。これが完了するとmvn clean compile、 \built で実行すると正常に動作します。それでも、グローバルな状態に触れずに、つまりベースをインストールすることなく、これを行うのは素晴らしいことです。これを達成する方法を誰かが知っている場合は、回答として追加してください]
  3. ソースツリーから直接自分のマシンで派生プロジェクトを実行できるようにする (mvn exec:run または同等のもの):
    • つまりmvn exec:run、\built\ で (必要に応じて) コンパイルして、derived.jar を実行する必要があります。
  4. 「共有コンポーネント」の使用例: 基本アーティファクトを共有リポジトリにプッシュし、他の人がそれを Maven の依存関係 (つまり、コンパイル時の依存関係) として使用できるようにします。
    • つまりmvn clean compile ???、これを ~/.m2/config.xml で指定された共有リポジトリにプッシュします
  5. 「イメージ ディレクトリ」ユース ケース: 派生アーティファクトとその依存関係をローカル ディレクトリにプッシュし、そこで「java -jar ...」を介して実行するか、他の人が取得できるように ftp/http 共有として公開できます。 . つまり、次のようなユースケースです。
    • mvn clean compile ???derived.jar と依存関係 (base.jar など) を ~/.m2/maven.repo/.../built または同等のものにプッシュし、cd ~/.m2/maven.repo/.../derived を実行します。そして実行java -jar derived.jarして実行します。
    • mvn clean compile ???base.jar を ~/.m2/maven.repo/.../base にプッシュします (または、derived.jar を対応するディレクトリにプッシュします)。これは、ローカル Web または ftp サーバーを介してダウンロード ポイントとして既に公開されています。

上記の目標を達成するにはどうすればよいですか?

親pomの関連セクションは次のとおりです。

...
<modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>parentpom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<name>parentpom</name>

<modules>
    <module>base</module>
    <module>derived</module>
</modules>
...

ベースpom.xmlの関連セクションは次のとおりです。

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

<modelVersion>4.0.0</modelVersion>
<groupId>com.foo.base</groupId>
<artifactId>base</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>base</name>
...

派生した pom.xml からの関連セクションは次のとおりです。

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

<modelVersion>4.0.0</modelVersion>
<groupId>com.foo.derived</groupId>
<artifactId>derived</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>derived</name>

<dependencies>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>base</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

...

よろしくお願いいたします。

4

1 に答える 1

40

親のpomは見栄えがしますが、モジュール/派生pomはそうではありません:いくつかの問題などを引き起こすいくつかの問題があります。

まず、派生/ベースモジュールに異なるgroupIdを使用しています。マルチモジュールビルドを使用している場合は、これを行うべきではありません。さらに、派生/ベースのバージョンは親によって継承されるため、明示的に設定しないでください。つまり、次のようなものが必要です。

<modelVersion>...</...>
...
<parent>
    <groupId>com.foo</groupId>
    <artifactId>parentpom</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>base</artifactId>
<packaging>jar</packaging>

<name>base</name>

groupIdは通常継承されます。ただし、サブモジュールのサブモジュールである可能性のあるモジュールの数が多い場合は、次のような構造になります。

+--- parent (pom.xml)
       +--- mod1 (pom.xml)
              +--- mod11 (pom.xml)
              +--- mod12 (pom.xml)
       +--- mod2 (pom.xml)

このような場合、mod1自体はpomパッケージモジュールです。

<modelVersion>...</...>
...
<groupId>com.company.project<groupId>  
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<modules>
  <module>mod1</module>
  <module>mod2</module>
</modules>

mod1:

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

<groupId>com.company.project.mod1</groupId>
<artifactId>mod1</artifactId>
<packaging>pom</packaging>

<modules>
  <module>mod11</module>
  <module>mod12</module>
</modules>

mod11:

<parent>
    <groupId>com.company.project.mod1</groupId>
    <artifactId>mod1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>mod11</artifactId>
<packaging>pom</packaging>

<modules>
  <module>mod11</module>
  <module>mod12</module>
</modules>

モジュール間に依存関係を作成する必要がある場合の解決策は次のとおりです。

<parent>
    <groupId>com.company.project.mod1</groupId>
    <artifactId>mod1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>mod11</artifactId>
<packaging>jar</packaging>

<dependencies>
  <dependency>
    <!-- This shouldn't be a dep which is packaging: pom -->
    <groupId>${project.groupId}</groupId>
    <artifactId>mod2</artifactId>
    <version>${project.version}</version>
  </dependency>

</dependencies>    

すべてのサブモジュールを1つにまとめてプロジェクト全体をコンパイルするには、親フォルダーに移動して次の手順を実行します。

mvnクリーンパッケージ

コンパイルなどが行われます。単一のプロジェクトのみをコンパイルする場合は、(親から)次の方法でコンパイルできます。

mvn -pl mod1

これは、プロジェクト全体を以前に一度インストールしたことがある場合にのみ機能します。別の解決策は次のとおりです。

mvn -am -pl mod1

他の人がアーティファクトにアクセスできるようにするための最も簡単な解決策は、リポジトリマネージャをインストールして次のことを行うことです。

mvnデプロイ

他のすべては、SNAPSHOT依存関係としてアーティファクトを使用できます。

于 2012-09-03T07:20:39.597 に答える