web-dev-qa-db-ja.com

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

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

  • data
  • consumer

モジュールconsumerには、モジュールdataが依存関係としてあります。

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

consumerモジュールには、これらの長いワインドオブジェクトのいくつかを作成する必要があるテストもあります。 data src/testツリーにあるテストでSampleDataHelperクラス(consumer src/testで定義)を使用したい。残念ながら、dataconsumerの依存関係ですが、consumerdata src/testの下に存在するクラスを見ることができません。

これに対抗するために、anotherモジュール(data-test)を作成し、SampleDataHelperをその下に移動することを考えました- src/main。それから、data-testdatatest scope依存関係として含めます。残念ながら、これにより循環依存関係が発生します。datadata-testを使用しますが、data-testにはdataも必要です。

私が思いついた唯一の解決策は、SampleDataHelperパッケージの下にdata src/mainの下にtestを配置し、それを実際のアプリケーションコードが呼び出さないようにすることです。

モジュール間でSampleDataHelperクラスを共有するにはwithoutsrc/mainの下に配置しますか?

105
Greg Kopff

消費者プロジェクトはデータプロジェクトに依存しているため、消費者の前にデータを構築する必要があります。その結果、提案されたテクニックを使用して コメント内 に、共有するすべてのテストコードが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>

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

128
Duncan Jones

問題はdataモジュールの(一部の)テストがSampleDataHelperクラスに依存するということです。 SampleDataHelperクラスをsrc/mainモジュールのdata-testに移動できます。同時に(特定のクラスに依存する)テストをsrc/testに移動できますdata-testモジュールの。その結果、循環的な依存関係はなくなります。

1
matsev