マルチモジュールmavenプロジェクトのモジュール間でsrc / testクラスを共有する


120

マルチモジュールのMavenプロジェクトがあります。この例のために、2つのモジュールを考えます。

  • data
  • consumer

モジュールにconsumerdata依存関係としてモジュールがあります。

モジュールdataは一連のコアクラスを宣言します。src/testそれらを使用するテストがあります。これらのテストでは、時間のかかるオブジェクトを作成する必要があるため、これらのオブジェクトを作成するためのユーティリティメソッドをいくつか含むクラスがあります。このユーティリティクラス(SampleDataHelper)はsrc/test階層にあります。

また、consumerモジュールには、これらの長い間処理されたオブジェクトのいくつかを作成する必要があるいくつかのテストがあります。ツリーにあるテストSampleDataHelperでクラス(で定義data src/test)を使用したいconsumer src/test。残念ながら、たとえdataの依存性であるconsumerconsumer下に存在するクラスを参照してくださいすることはできませんdata src/test

これに対抗するために、別のモジュール(data-test)を作成SampleDataHelperし、その下に移動するとしsrc/mainます。次にdata-test、のテストスコープ依存関係を含めますdata。残念ながら、これにより循環依存が発生します。をdata使用しますdata-testが、data-testも必要dataです。

私が作ってみた唯一の解決策は、場所にあるSampleDataHelperdata src/mainの下のtestパッケージと本当のアプリケーションコードが今までそれを呼び出していないことを願っています。

下に置かSampleDataHelperモジュール間でクラスを共有するにはどうすればよいですか?src/main


1
この答えをチェックしてください。お役に立てればと思います。
Andrew Logvinov、2013


@AndrewLogvinov:リンクされた回答には「2ステップ」のビルドが必要ではないでしょうか?2番目のモジュール()をコンパイルする前に、最初に1つのモジュール()をビルドしてデプロイします。dataconsumer
Greg Kopff 2013

を使用すると問題が発生する可能性がありますmvn packagemvn installまたはを使用すると、シングルステップビルドで問題なく機能するはずですmvn deploy。簡単なメモ。私たちの大規模プロジェクトの1つには、junitのラッパーがTestBaseあり、src/mainこれは私が良いアイデアだとは思わない場所にあります。
Andrew Logvinov

回答:


152

コンシューマープロジェクトはデータプロジェクトに依存しているため、コンシューマーより先にデータを構築する必要があることを嬉しく思います。その結果、コメントで提案さた手法を使用して、共有したいすべてのテストコードがDataプロジェクトに含まれていることを確認し、POMを構成してテストJARを生成します。

<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>

その後、コンシューマープロジェクトは、通常のデータJARアーティファクトと追加のtest-jarアーティファクトの両方に依存します。もちろん、テストスコープは次のとおりです。

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

私はこのアプローチを何度も使用してきましたが、うまく機能します。


1
「コンシューマープロジェクトは、通常のデータJARアーティファクトと追加のテストjarアーティファクトの両方に依存する」部分に関して、データの両方の依存関係をコンシューマーに追加すると(データとコンシューマーというアーティファクトもあるとします)pom、特定のバージョンを指定しないと、pomでエラーが発生しました。なぜそれが起こるのですか?
ジョニー

@StasSはおそらくそれについて別の質問を開くのが一番です。
Duncan Jones


1

それで問題は、dataモジュールの(いくつかの)テストがSampleDataHelperクラスに依存しているということです?あなたが移動することができますSampleDataHelperにクラスをsrc/maindata-testあなたが同時にに(特定のクラスに依存)のテストを移動する場合、モジュールsrc/testdata-testモジュール。その結果、循環依存関係はなくなります。


1
私があなたを理解しているのであれば、使用するすべてのテストをモジュールまたはモジュール(適切な場合)SampleDataHelperからに移動することを提案しています。残念ながら、テストがモジュールから別のテストに移動するため、これは非常に「きちんとした」ソリューションとは言えません。(厳密に言えば、あなたはテストを移動するだけだと言っていましたが、私は一貫性を保つために両方を移動していると思います)。しかし、あなたの答えをありがとう。:-)dataconsumerdata-testdata
Greg Kopff 2013

1
はい、あなたは私を正しく理解しました。そして間違いなく、それはきちんとした解決策よりも迅速な解決策です。:-)
matsev 2013

循環依存関係が残ると思います。問題のテストがDataプロジェクトで定義されたクラスを実行すると仮定すると、Data-TestプロジェクトからDataプロジェクトへの参照を戻す必要があります。
ダンカンジョーンズ

1
@DuncanJones申し訳ありませんが、私の投稿に小さなタイプミスがありました。私が作ろうとしているポイントは、data-testモジュールがモジュールに依存している必要があることdataです(逆ではありません)。循環依存関係を回避するには、現在dataを使用するモジュールに常駐しているすべてのテストをモジュールSampleDataHelperに移動する必要がありdata-testます。
matsev 2013

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