マルチモジュールのMavenプロジェクトがあります。この例のために、2つのモジュールを検討します。
data
consumer
モジュールconsumer
には、モジュールdata
が依存関係としてあります。
モジュールdata
は、多数のコアクラスを宣言します。 src/test
の下に、それらを使用するテストがあります。これらのテストには、長時間にわたるオブジェクトの作成が必要なので、これらのオブジェクトを作成するためのユーティリティメソッドを含むクラスがあります。このユーティリティクラス(SampleDataHelper
)はsrc/test
階層にあります。
consumer
モジュールには、これらの長いワインドオブジェクトのいくつかを作成する必要があるテストもあります。 data src/test
ツリーにあるテストでSampleDataHelper
クラス(consumer src/test
で定義)を使用したい。残念ながら、data
はconsumer
の依存関係ですが、consumer
はdata src/test
の下に存在するクラスを見ることができません。
これに対抗するために、anotherモジュール(data-test
)を作成し、SampleDataHelper
をその下に移動することを考えました- src/main
。それから、data-test
をdata
のtest scope依存関係として含めます。残念ながら、これにより循環依存関係が発生します。data
はdata-test
を使用しますが、data-test
にはdata
も必要です。
私が思いついた唯一の解決策は、SampleDataHelper
パッケージの下にdata src/main
の下にtest
を配置し、それを実際のアプリケーションコードが呼び出さないようにすることです。
モジュール間でSampleDataHelper
クラスを共有するにはwithoutsrc/main
の下に配置しますか?
消費者プロジェクトはデータプロジェクトに依存しているため、消費者の前にデータを構築する必要があります。その結果、提案されたテクニックを使用して コメント内 に、共有するすべてのテストコードがDataプロジェクトに含まれていることを確認し、テストJARを生成するようにPOMを構成します。
<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>
私はこのアプローチを何度も使用してきましたが、うまく機能しています。
問題はdata
モジュールの(一部の)テストがSampleDataHelper
クラスに依存するということです。 SampleDataHelper
クラスをsrc/main
モジュールのdata-test
に移動できます。同時に(特定のクラスに依存する)テストをsrc/test
に移動できますdata-test
モジュールの。その結果、循環的な依存関係はなくなります。