2.6. JPMS
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
--add-opens java.base/jdk.internal.math=ALL-UNNAMED
さらに、--illegal-access=warn
オプションを java
コマンドに渡すことで、不正アクセスのケースを確認できます。このオプションは、Red Hat build of OpenJDK のデフォルトの動作を変更します。
ClassLoader
JPMS リファクターリングにより、Red Hat build of OpenJDK 11 の ClassLoader
階層が変更されます。
Red Hat build of OpenJDK 11 では、システムクラスローダーが URLClassLoader
のインスタンスではなくなりました。Red Hat build of OpenJDK 11 で ClassLoader::getSystemClassLoader
を呼び出してその結果を URLClassLoader
にキャストする既存のアプリケーションコードでは、ランタイム例外が発生します。
Red Hat build of OpenJDK 8 では、クラスローダーを作成するときに、このクラスローダーインスタンスの親として null
を渡すことができます。ただし、Red Hat build of OpenJDK 11 では、クラスローダーの親として null
を渡すアプリケーションにより、クラスローダーがプラットフォームクラスを見つけられなくなる可能性があります。
Red Hat build of OpenJDK 11 には、特定のクラスのロードを制御できる新しいクラスローダーが含まれています。これにより、クラスローダーが必要なすべてのクラスを見つける方法が改善されます。Red Hat build of OpenJDK 11 では、クラスローダーインスタンスを作成するときに、ClassLoader.getPlatformClassLoader()
API を使用してプラットフォームクラスローダーを親として設定できます。
関連情報
- JPMS の詳細は、JEP 261: Module System を参照してください。