2018 年 9 月、 Java 11 がリリースされました。Java 10 までは開発用の JDK と実行環境の JRE、 2 つのパッケージが提供されていたのですが、 Java 11 から JDK のみとなり Java 実行環境 (JRE) は単体配布されなくなりました。
オラクルが配布している Oracle JDK、 Oracle OpenJDK だけでなく、 ほかの OpenJDK ビルド Zulu OpenJDK でも JRE は配布されていません。
- 2019-04-26 訂正
- AdoptOpenJDK では JRE も配布していました。
どうして、 JRE が配布されなくなってしまったのでしょうか?
新たなアプリケーション配布方法の提案
オラクルが JDK の新しいリリース ・ モデルおよび提供ライセンスについて発表しています。
前半はリリース ・ サイクルの変更や商用利用の有償化など JDK に関する内容が記載されています。後半に “軽量化した JRE をバンドルする配布方式の提案” という見出しがあり、 JRE に関して記述されています。少し長いですが引用します。
軽量化した JRE をバンドルする配布方式の提案
Java アプリケーションは現在、 システムにインストールされた JRE を使って実行されていますが、 近年はこの実行モデルが多くの弊害を生んでいます。Java の脆弱性問題から最新版の JRE に移行する必要が生じた際、 ユーザー側はアプリケーション ・ ベンダーが最新版を推奨していないために移行できず、 一方でアプリケーション ・ ベンダー側は多くのユーザーが旧バージョンを利用しており、 サポートの手間を考慮すると簡単には移行できないといったジレンマが生じるケースもあるでしょう。このような問題が起きる原因の 1 つは、 「Java アプリケーションの実行環境として JRE をプリインストールし、 開発元が異なる全てのアプリケーションを同じ JRE で実行する」 という実行モデルにあると考えられます。オラクルは今後、 この問題の解決策となる新たなアプリケーション配布方法についても具体策を提案/提供していきます。
例えば、 今後は使用する JRE をアプリケーション側でコントロールし、 個別にバンドルするという方法が考えられます。 オラクルは、 これまでもこの方法を提案してきましたが、 その実現には 1 つの課題がありました。それは 「JRE のサイズ」 の問題です。
Java SE 8 までの Java 仕様では JRE のサブセットを作ることはできず、 アプリケーションが使わないライブラリも含めたフルセットの巨大な JRE をバンドルする必要がありました。この問題は JDK 9 で導入された Project Jigsaw によって解決され、 現在はアプリケーションが必要とするライブラリだけで構成した JRE のサブセットを作り、 バンドルすることが可能となっています。 これにより、 それぞれのアプリケーションにバンドルする JRE のサイズを最小化することができます。Project Jigsaw の導入に伴いライブラリ間の依存関係を整理した結果、 JRE の起動時間も短縮されています。
これらを踏まえ、 今後はカスタマイズした JRE をアプリケーションにバンドルする方法を推奨していくとともに、 JRE のカスタマイズ ・ ツールとして JDK 9 よりバンドルを開始した 「jlink」 の機能拡充を進めていきます。
ふむふむ、 なるほど。単体配布の JRE をシステムにインストールして複数の Java アプリケーション実行で JRE を共有する構成だと、 一部の Java アプリケーションの都合で JRE のバージョンアップができなかったりといった弊害があったわけですね。
そして、 Java 9 で導入されたモジュール機構 (Project Jigsaw) によって、 アプリケーションが必要とする小さな JRE を構成できるようになったのでアプリケーションに JRE を同梱してしまえばいいよ、 という提案です。
共有される JRE をシステムにインストールする構成には多くの弊害がある、 ということで JRE が単体配布されなくなったようです。これからは、 JDK を使ってアプリケーションごとの JRE を出力してバンドルしていきましょう。
アプリケーションごとにカスタマイズした JRE を作る方法について書かれた以下の記事もご一読ください。
- 2018-03-26 アプリケーション配布用に小さな JRE を作る
- 2018-11-26 OpenJDK で Java アプリ配布パッケージを作る