2.6. Java ライブラリークラス
Red Hat build of OpenJDK 9 で導入された Java Platform Module System (JPMS) は、非公開 API へのアクセスを制限または防止します。JPMS は、クラスパスやモジュールパスの使用など、Java アプリケーションを起動およびコンパイルする方法にも影響を与えます。
デフォルトでは、Red Hat build of OpenJDK 11 は JDK 内部モジュールへのアクセスを制限します。アプリケーションを移植する際のこの制限の回避策として、java
コマンドにオプションを渡すことにより、アプリケーションの内部パッケージへのアクセスを提供できます。これらのオプションは、次の例で示されています。
--add-opens <module-name>/<package-in-module>=ALL-UNNAMED --add-opens java.base/jdk.internal.math=ALL-UNNAMED
Red Hat build of OpenJDK リリースサイクルの更新のため、以前の回避策は無期限に機能するわけではありません。Red Hat build of OpenJDK の将来のリリースでは、この回避策は廃止されます。
さらに、--illegal-access=warn
オプションを java
コマンドに渡すことで、不正アクセスのケースを確認できます。このオプションは、Red Hat build of OpenJDK のデフォルトの動作を変更します。
JPMS リファクターリングにより、Red Hat build of OpenJDK 11 の ClassLoader
階層が変更されます。Red Hat build of OpenJDK 11 は、システムクラスローダーを内部クラスに設定するため、Java プログラムはシステムクラスローダーにアクセスできません。
たとえば、ClassLoader::getSystemClassLoader
を呼び出し、その結果を Red Hat build of OpenJDK 11 上の URLClassLoader
にキャストする既存の Red Hat build of OpenJDK 8 のアプリケーションコードは、URLClassLoader
がシステムクラスローダーの一部ではないため、機能しない可能性があります。Red Hat build of OpenJDK 11 で URLClassLoader
に結果をキャストしようとすると、ランタイム例外メッセージを受け取る可能性があります。
Red Hat build of OpenJDK 11 には、特定のクラスのロードを制御できる新しいクラスローダーが含まれています。これにより、クラスローダーが必要なすべてのクラスを見つける方法が改善されます。
クラスローダーを作成すると、その親として null
を渡すことができなくなります。Red Hat build of OpenJDK 11 でこれを行うと、親としてクラスローダーが選択されず、新しいクラスローダーはプラットフォームクラスを見つけることができません。ClassLoader.getPlatformClassLoader()
API を使用して、プラットフォームクラスローダーのインスタンスを取得できます。
関連情報
- JPMS の詳細については、JEP 261: Module System を参照してください。