マルチモジュールプロジェクトでのMavenテストの依存関係


86

私はMavenを使用してマルチモジュールプロジェクトを構築しています。私のモジュール2は、コンパイルスコープのモジュール1 srcと、テストスコープのモジュール1テストに依存しています。

モジュール2-

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>test</scope>
   </dependency>

これは正常に機能します。私のモジュール3がModule1srcに依存し、コンパイル時にテストするとします。

モジュール3-

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>

を実行するmvn clean installと、ビルドはモジュール3まで実行され、モジュール1のテスト依存関係を解決できなかったため、モジュール3で失敗します。次にmvn install、モジュール3だけで実行mvn installし、戻って親pomで実行し、ビルドします。どうすればこれを修正できますか?


親のpomがどのように見えるかを教えてください。
クリスガマー

回答:


127

あなたが何をしようとしているのか疑問ですが、プロジェクト(module1)用に作成したテストを別のプロジェクトで再利用したいと思います。添付のテストを使用するためのガイドの下部にあるメモで説明されているように:

このガイドの以前のエディションでは、の<classifier>tests</classifier>代わりに使用することをお勧めしていることに注意してください<type>test-jar</type>。これは現在いくつかのケースで機能しますが、インストール前のライフサイクルフェーズが呼び出された場合、テストJARモジュールおよびコンシューマーのreactorビルド中には正しく機能しません。このようなシナリオでは、Mavenはreactorビルドの出力からではなく、ローカル/リモートリポジトリからテストJARを解決します。明らかに、リポジトリのJARが古くなっているか、完全に欠落しているため、ビルドが失敗する可能性があります(MNG-2045を参照)。

したがって、最初に、コンパイルされたテストをJARにパッケージ化し、一般的に再利用できるようにデプロイするにはmaven-jar-plugin、次のように構成します。

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.2</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

次に、通常どおり(mvn installまたはを使用してmvn deploy)テストJARアーティファクトをインストール/デプロイします。

最後に、テストJARを使用するには、次のタイプを指定して依存関係を指定する必要がありますtest-jar

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>

3
パスカル。まず第一に、すべてのMavenの質問に答えてくれてありがとう!! この質問について。まだ問題があります。コアモジュールの1つに、すべての子オブジェクトで使用したいtestBaseクラスがあります。現在、CIにMavenビルドがあります。test-jarへのdeployのインストールを実行したくない場合は、トランクから新しいコピーをチェックアウトしてmvnテストを実行します。私はまだどこにもtest-jarを持っていないので、これは失敗します。それに対処する方法はありますか?
ローマ

@Roman実行中のインストールは「自然な」方法です。しかし、回避策を見つけたようです。
パスカルティベント

この時点で保留になっているのは、2045ではなく3559の問題のようです: jira.codehaus.org/browse/MNG-3559
HDave

これは何が起こっているかを説明していますが、回避策は提供していません。OP(および私など)がすでに行っていることを行うことを提案するだけです。
Antoniossss

19

パスカルの質問に対する私のコメントに関して、私は適切な答えを見つけたと思います:

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
            <phase>test-compile</phase>
        </execution>
        </executions>
        <configuration>
            <outputDirectory>${basedir}\target</outputDirectory>
        </configuration>
    </plugin>
</plugins>

ここに表示されている主な違いは、 <phase>タグです。

test-jarを作成します。これは、パッケージフェーズの後だけでなく、テストのコンパイルフェーズでも使用できます。

私のために働きます。


1
はい、とても便利です。共有していただきありがとうございます。デプロイアプローチは、企業ディレクトリがある場合にのみ優れていると思います(はい、これが強く推奨されることはわかっています)。ありがとう@ Roman–
ダミアン

2

https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.htmlは言います:

テストクラスを含むjarを作成する方法テストクラスを含むjarを作成する場合は、それらのクラスを再利用することをお勧めします。これを解決するには2つの方法があります。

  1. The easy way 現在のプロジェクトのテストクラスを使用して添付のjarを作成し、推移的なテストスコープの依存関係を失います。

  2. The preferred way テストクラスを使用して別のプロジェクトを作成します。

詳細については、その記事をお読みください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.