web-dev-qa-db-ja.com

Eclipseでは、modulepathとclasspathの違いは何ですか?

Eclipseでは、モジュールパスとクラスパスの違いは何ですか?また、libフォルダにjarを追加するにはどちらを使用する必要がありますか?また、モジュールパスにJREシステムライブラリが表示されるのはなぜですか?

22
QuantumQuaver

モジュールシステムは、主にコードに次の影響を及ぼします。

  • パッケージは1つのモジュールからのみアクセスできます(ネストされたパッケージは個別として扱われるため、パッケージJava.utilがモジュールJava.baseにある場合でも、パッケージJava.util.loggingはモジュールJava.loggingにある可能性があります)
  • 他のモジュールのエクスポートされたパッケージ内のコードのパブリックフィールドとメソッドにのみアクセスできます。これはリフレクションでも当てはまります(つまり、Java.lang.reflect.AccessibleObject.setAccessible(boolean)は同じモジュール内のコードでのみ機能します)

クラスパスにあるすべてのコードは、「名前のない」モジュールに共存します。 modulepath上のすべてのコードは、独自の「名前付き」モジュールに存在します。

次の2つのケースを区別する必要があります。

  • Module-info.Javaをプロジェクトに追加しない場合、プロジェクトは名前のないモジュールの一部となり、名前のないモジュールの他のすべてのコードに加えて、Java.baseのコードとJava.seルートモジュールのモジュールのコードを見ることができます。基本的に、これはw.r.t.クラスパス上のコード、すべてがJava 8のように機能するため、クラスパスに依存関係を置くだけです。

  • プロジェクトにmodule-info.Javaがある場合、プロジェクトは独自の名前付きモジュール内にあり、Java.baseのコードとmodule-info.Javaの「requires」句を使用して参照されている他の名前付きモジュールのみを表示できます。名前付きモジュールはモジュールパスを介してのみ検出されるため、依存関係をクラスパスに配置する必要があります。これは、Java 9より前に作成されたjarでも機能し、.jarファイル名から派生したモジュール名を取得します(この場合、それらは「自動」モジュールと呼ばれます)。

JREは常にモジュールパス上にあるため、クラスパス上のコードからでも内部コードにアクセスできません。

特別なケースが1つあります。プロジェクトにmodule-info.Javaがあり、プロジェクトにテストコードがある場合、通常、module-info.Javaにjunitのようなテストの依存関係を記載したくないでしょう。これには2つの解決策があります。

  • 専用のテストモジュールを作成します。これは常にosgiベースのプロジェクトの慣習です。欠点は、テストでパブリックAPIしか使用できないことです

  • Mavenが使用するソリューション:テストの依存関係をクラスパスに配置します。テストコードをコンパイルする際、mavenは、名前付きモジュール内のコードが名前なしモジュールを読み取れるようにするコマンドラインオプションを追加します(module-info.Javaを介しては不可能です)。

Eclipse Oxygenでは、mavenソリューションはどのコードがテストコードであるかという概念がないため不可能でしたが、これは6月にリリース予定のEclipse Photon(4.8)リリースで実装されました。 http://download.Eclipse.org/Eclipse/downloads/ から(機能完全な)マイルストーンビルドを既に使用できます。バグを見つけた場合は、 https://bugs.Eclipse.org/bugs/ で報告してください。

15
Till Brychcy