2

プロジェクト「java11-app」と共有するテスト jar アーティファクトを生成するプロジェクト「java11-core」があります。これらのプロジェクトは、コマンド ライン Maven で正常にビルドされますが、Eclipse 内では、テスト jar で共有されているクラスが見つかりません。

バージョン情報:

  • Apache Maven 3.6.0 (コマンドラインおよび Eclipse)
  • Java バージョン: 11.0.1、ベンダー: Oracle Corporation
  • Eclipse IDE: バージョン: 2018-09 (4.9.0)
  • M2E プラグイン: 1.9.1.20180912-1601

私はもともとこれらを従来の非JPMSプロジェクトとしてプロジェクトに作成しました。これらのプロジェクトは、期待どおりに正常にコンパイルおよび実行されました。module-info.java を java11-core と java11-app の両方に追加した後、Eclipse コンパイラーはコア プロジェクトの共有テスト ファイルを認識できませんでした。

これは、プロジェクト構造の概要を示すパッケージ エクスプローラーのスナップショットです。

ここに画像の説明を入力

それぞれ追加された java11-app および java11-core module-info コンテンツ:

module com.java11.app {

    exports com.java11.app;
    requires com.java11.core;
}

module com.java11.core {

    exports com.java11.core;
}

ご覧のとおり、com.java11.core からテスト ユーティリティ パッケージをエクスポートしません。テスト パッケージをエクスポートしたくありません。エクスポートすると、テスト クラスが公開されてしまうからです。また、新しいテスト プロジェクトを導入したくもありません。実際のシナリオでは、テスト ユーティリティと、テストを支援するプロジェクトとの間に循環的な依存関係が必要になる可能性が非常に高いからです。

ここに画像の説明を入力

AppTest.java のビルド エラー。Eclipse によって報告された失敗の興味深い点は、CoreTestUtil クラスが見つからないと主張しているのではなく、次のことです。

The type com.java11.test.core.util.CoreTestUtil is not accessible   AppTest.java    /java11-app/src/test/java/com/java11/app    line 8  Java Problem
CoreTestUtil cannot be resolved                                     AppTest.java    /java11-app/src/test/java/com/java11/app    line 21 Java Problem

私の仮定は、java11-core からのこのパッケージのエクスポートの欠如、および/または java11-app でのこのパッケージの require の欠如により、クラスが別のテスト jar に存在する場合でも、Eclipse はアクセスが制限されていると信じるようになるということです。 .

java11-app のモジュール パスには、java11-core がモジュールとして含まれていることが示され、テスト コードなしがNoに設定されています。

ここに画像の説明を入力

私は新しくリリースされた機能に取り組んでいることを知っていますが、Eclipse JPMS プロジェクト全体でテスト クラスを共有することはまだサポートされていないのではないかと疑っています。しかし、サポートされている更新をどこで探すべきか (Eclipse? M2E プラグイン) がわかりません。また、ソフトウェア プロジェクトに JPMS を採用している間に生産性を高めるための回避策も知りません。

テストユーティリティをこのように共有すべきではないと信じている人のために...

この問題は、テスト ユーティリティを別のモジュールにリファクタリングすることによって解決する必要があるベスト プラクティスの問題として特徴付けられています。私はこの観点を尊重しますが、そのガイダンスに従おうとすると、DRY (Don't Repeat Yourself) やパッケージ間の循環依存関係など、他のベスト プラクティスに違反することを余儀なくされていることに気付きました。

モジュールの効果的なテストを支援し、そのモジュールに依存するモジュールの開発中に、テスト ユーティリティが出現することはよくあることです。これらのユーティリティが別のモジュールに引き出されると、これによりサイクルが作成されます。さらに、これらのユーティリティの一部は、そのモジュールに依存する他のモジュールをテストするときにも同様に役立ちます。これらのユーティリティが依存関係の新しいテスト モジュールにコピーされると、重複するコードが作成されます。この理由が、Maven の「test-jar」サポートが最初に追加された理由である可能性があります。

4

2 に答える 2

1

Eclipse は、プロジェクトごとに複数のモジュール情報をサポートしていません。ソース フォルダー (メインまたはテスト) に関係なく、モジュール情報は 1 つだけである必要があります。

Eclipse の観点から見ると、あなたの唯一の幸運は、適切なモジュール情報/エクスポートを使用して、他のプロジェクトを参照する新しい Java プロジェクトを作成することです。

module mod.a {
  exports com.example.a;
  // com.example.a.Main
}

module mod.a.tests { // (1)
  exports com.example.a.tests;
  // com.example.a.tests.MainUtils calling com.example.a.Main
  requires mod.a;
}

(1) の場合、 を使用しないと問題が発生します。おそらく、2 番目のプロジェクトが最初のプロジェクトをシャドウするため、mod.a.testsJava は を検出しません。com.example.a.Main

org.eclipse.m2e.core私はOSGIの専門家ではありませんが、ほとんどの Eclipse プラグインがメイン プロジェクトとテスト プロジェクトを持っている理由の 1 つはそれだと思います。 org.eclipse.m2e.core.tests

ただし、module-info には「パッチ」に関する知識がありません。コマンド ライン ( java --patch-module) でモジュールにパッチを適用することはできますが、module-info 自体ではできません。おそらく Eclipse はユーザーに代わってそれを行うことができますが、そうではありません。

ご覧のとおり、Eclipse の 2 つのプロジェクト = 2 つの Maven モジュールです。

Maven の場合、同じビルドで他のアーティファクトを確実に作成できます (二次アーティファクトが依存関係を必要とするたびに、共通のスコープに移動する必要があるため、依存関係を汚染する傾向があると思います)。

これは、maven-compiler-plugin、maven-shade-plugin、および maven-jar-plugin を使用して実行できます。

  • とディレクトリをマージして Javaの をエミュレートしたいので、test-jarに頼るべきではないと思います。--patch-moduleclassestest-classes
  • 複数のため、このプロジェクトを Eclipse にインポートしたくありませんmodule-info。または、そのモジュール情報が Maven にのみ表示されるようにする必要があります (プロファイル + m2e.version を使用して、m2e を検出して無効にすることができます)。
于 2021-07-28T21:22:06.617 に答える