11

私はJava 9を初めて使用し、YouTubeでJavaによるモジュラービデオレクチャーを行っていました。彼らは、モジュール化の 3 つの利点について言及しました。

分割パッケージについて私が理解している限りでは、アプリケーションが複数の依存関係に依存しているとしましょう。パッケージ abc.pqr.xyz が 1 つ以上の jar に存在するとします。次に、そのパッケージの一部のクラスが jar1 から使用され、他のクラスが jar2 から使用される可能性があります。これにより、実行時にデバッグが困難な問題が発生する可能性があります。

ビデオは、モジュール化がこの問題を解決すると述べています。しかし、それは私が理解しようとしていることですか?

以下のモジュール情報を持つ test.module1 があるとしましょう -

module test.module1{
exports abc.pqr.xyz;
}

以下のモジュール情報を持つ別のmodule2-

module test.module2{
 exports abc.pqr.xyz;
}

ここで、私のアプリケーションで、これらのモジュールの両方の依存関係を追加したとしましょう-

module test.myapp{
 requires test.module1;
 requires test.module2;
}

ここでも、いくつかのクラスがこれらのモジュールの両方に存在する可能性がある 2 つのモジュール依存関係があります。では、実行時にどのモジュールからクラス定義を取得するかがどのように解決されるのでしょうか? Java 9は分割パッケージの問題をどのように回避しますか?

4

2 に答える 2

9

質問で説明されているシナリオでは、次のようなエラーに直面し始めます。

モジュールはとtest.myappの両方からパッケージを読み込みますtest.module1test.module2

The State of the Module Systemからのモジュールの読みやすさは、次のようにモジュールの使用について詳しく説明しており、ユースケースに興味を持たせるものとします (私の強調):

モジュール グラフで定義された読みやすさの関係は、信頼性の高い構成の基礎となります。 モジュール システムにより、

  • すべての依存関係が正確に 1 つの他のモジュールによって満たされること
  • 加群グラフが非循環であること
  • すべてのモジュールが、特定のパッケージを定義する最大 1 つのモジュールを読み取ること
  • また、同名のパッケージを定義するモジュールは互いに干渉しません

モジュールシステムで同じことを暗示することの利点も詳細に説明されています

信頼性の高い構成は、信頼性が高いだけではありません。また、高速化することもできます。モジュール内のコードがパッケージ内の型を参照する場合、そのパッケージは、そのモジュールまたはそのモジュールによって読み取られるモジュールの正確に 1 つのいずれかで定義されることが保証されます。

したがって、特定の型の定義を探すときに、複数のモジュールで検索する必要はなく、さらに悪いことに、クラスパス全体に沿って検索する必要もありません。


とはいえ、実装に対する現在の解決策は

  • モジュールtest.module1test.module2明示的なモジュールである場合は、それらのいずれかでabc.pqr.xyzパッケージを実装することを選択できます。 または、両方から独自の別のモジュールにパッケージを引き出して、その後クライアント間で独立したモジュールとして使用できます。test.mergeModule

  • これら (またはそれらのいずれか) が自動モジュールである場合、クラスパスに拡張されたブリッジを使用して、そのような jar をクラスパスに残し、名前のないモジュールとして扱われるようにすることができます。これにより、デフォルトですべてのパッケージがエクスポートされます。同時に、他のすべての名前付きモジュールを読み取りながら、自動モジュールも名前なしモジュールを読み取るようになります

    ドキュメントを再度引用し、例を示して、質問に関連付けることができるようにします。

    たとえば、明示的なモジュール com.foo.app 内のコードが 内のパブリック タイプを com.foo.bar参照し、そのタイプのシグネチャがクラス パス上にある JAR ファイルの 1 つのタイプを参照している場合、内のコードは 名前のないモジュールに依存できないため、com.foo.appその型にアクセスすることはできません。com.foo.app

    com.foo.appこれは、クラスパス上の関連する JAR ファイルが自動モジュールとして扱われるか、明示的なモジュールに変換されるまで、コードがクラスパスから型にアクセスできるように、一時的に自動モジュールとして扱うことで解決できます。

于 2018-08-13T18:58:08.253 に答える