IntelliJのロジックを排除するために、私は自分のモジュール(1,4)から3つのJARを構築し、コマンドラインでjavaを使用して遊び始めました。
-cpオプションのみを使用してコードを実行しようとすると、module4がpkg2にアクセスできるのと同じ動作をしました - >これは、IntelliJにmodule-info.javaファイルがない場合モジュールはクラスパスを使用します。
ここでは難しい部分があります: module4の自動名がmodule4であることを確認するために--list-modulesオプションを使用しました。私はPKG1からクラス上のClassNotFoundException(エクスポートしたパッケージを)持っている
java -p "<module1 path>;<module4 path>" -m module4/<MainClass>
: は、その後、私は次のように実行してきました。
私が実行している場合:
java -p "<module1 path>;<module2 path>" -m module2/<MainClass>
をその後、すべての作品。
モジュールパスを使用したい場合、メインクラスはモジュール化されたJARでなければならないようです。
自動JARは下位互換性のため、新しいモジュールの依存関係として使用できます。
モジュールパスを使用してモジュールを実行する場合、Javaは実行中のJARがモジュール化されたJARであるとみなします。そうでなければ、クラスパスを使用し続ける必要があります。
つまり、-p(modulepath)オプションを使用してモジュール化されていないJARを実行すると、パスに他のモジュールは必要ありません。
これらの結論は、Javaで遊んできたものです。誰かがその背後にある理論の正確な部分を教えてくれますか?
これは、カプセル化をモジュール化されたJARのみに制限しますか?私はそのようなデザインの論理を理解していません。私のモジュールがパッケージを公開しないと決めた場合、それがモジュール化されたJARまたはモジュール化されていないJARによって使用されるかどうかは気にする必要がありますか?それが本当の場合は、この機能は私には壊れているようです(これはモジュールの前にも当てはまりましたが、まだ理解しています)。 – AntonKam
@Nicolaiまあ、両方のパッケージにアクセスできるという質問がありました。モジュールが読み込んだモジュールによってエクスポートされたパッケージにアクセスできる必要があるという合意に達しました。 – nullpointer