最新Java動向2022

2022年のJavaまるわかり!最新バージョンからJavaを取り巻く環境まで

誕生から27年目を迎えたJava

プログラミング言語の「Java」は、2022年5月をもって誕生から27周年を迎えました[1]。本稿執筆時点(2022年7月)の最新バージョンはJava 18で、現在も新機能の追加をはじめとして活発な開発が行われています。

“レガシー言語⁠と言われることも少なくないJavaですが、実際には依然として高いシェアを誇っており、とくにエンタープライズアプリケーション開発の現場ではなくてはならない存在であり続けています。本稿では、そんなJavaに関する最新の動向をお伝えします。

Javaは誰が作っているのか

「Java」は、プログラミング言語であるJava言語と、実行環境であるJVM(Java Virtual Machine)を中心としたプログラミング技術の総称です。単に「Java」と言った場合、Java言語そのものを指すこともあれば、実行環境やコンパイラなどの周辺技術を含む場合もあります。

Java言語やJVM、標準で含まれるライブラリなどの仕様は「Java SE(Java Standard Edition⁠⁠」と呼びます。Javaの仕様にはJava SEのほかにもモバイル端末向けの「Java ME」やエンタープライズアプリケーション向けの「Java EE」といったものがあります。しかしJava MEは現在ではほとんど使われておらず、Java EEは後述するようにオープンソース化されて「Jakarta EE」という名称に変わったため、現在は実質的にJava SEだけがJavaの仕様となっています。そのため、Javaの仕様を指す場合にも「SE」を省略して単に「Java」と呼ばれることが多くなっており、本稿でも以降は「SE」を省略して単に「Java」と表記します。

さて、Javaのプログラムの開発や実行をするためには「JDK(Java Development Kit)というツールキットが必要です。JDKには、Javaの仕様に基づいたコンパイラやJVM、標準ライブラリなどの開発に必要なツール一式が含まれています。そのため、実質的にはこのJDKがJavaの本体と言うことができるでしょう。

現在、JDKの開発を担っているのはOpenJDKプロジェクトです。OpenJDKはJDKのオープンソース版という位置付けですが、現在リリースされているJavaアプリケーションの開発および実行環境は、そのほとんどがこのOpenJDKをベースとしたものであるため、実質的にはOpenJDKプロジェクトがJavaを作っていると言っていいでしょう。OpenJDKプロジェクトには多くの企業や団体、個人が参加してるので、そういう意味ではJavaは世界中のみんなで作っていると言うこともできます。

図1 JDKの開発体制のイメージ
図1

実際の開発で使用するのはJDKディストリビューション

OpenJDKプロジェクトでは、その成果物としてソースコードを公開していますが、これはまだ各自のPCなどで実行できる状態にはなっていません。そこでJavaをサポートしている各ベンダーは、OpenJDKプロジェクトの成果物をベースにした実行可能なJDKのパッケージの提供を行なっています。このような形で各社がリリースしているJDKを「JDKディストリビューション」と呼びます。おもなJDKディストリビューションとしては次の表のようなものを挙げることができます。

名称 提供元 URL
Oracle JDK Oracle https://www.oracle.com/java/technologies/downloads/
Oracle OpenJDK Oracle https://jdk.java.net/
Temurin Adoptium https://adoptium.net/
Amazon Corret Amazon Web Service https://aws.amazon.com/jp/corretto/
Red Hat build of OpenJDK Red Hat https://developers.redhat.com/products/openjdk/
Azul Zulu Azul Systems https://www.azul.com/downloads/
Microsoft Build of OpenJDK Microsoft https://docs.microsoft.com/ja-jp/java/openjdk/download
Liberica JDK BellSoft https://bell-sw.com/pages/downloads/
SapMachine SAP https://sap.github.io/SapMachine/

この表に載せたJDKはいずれも基本的には無償で利用することができますが、無償利用できる条件やサポート期間などはそれぞれで少しずつ異なるので注意が必要です。特にOracle JDKとOracle OpenJDKの違いについては少し説明が必要かもしれません。

この両者は、いずれもOpenJDKの成果物をベースにしてOracleが実行可能なパッケージとして提供しているJDKディストリビューションであり、中身は実質的に同じものです。大きく異なるのはライセンス体系と無償利用できる範囲です。Oracle OpenJDKはOpenJDKと同じ「Classpath例外付きのGPL v2」というオープンソースライセンスで提供されているのに対して、Oracle JDKの方はOracle No-Fee Terms and Conditions(NFTC)という独自のライセンスになっています。

ライセンスが異なるのは、オープンソースのプロダクトとして無償提供されているOracle OpenJDKに対して、Oracle JDKはあくまでもOracleによる商用プロダクトという位置付けで提供されているためです。NFTCでは、商用・非商用に関わらず原則として無償で利用できるということになっていますが、Oracleによればこの無償利用の範囲には「外部向けのアプリケーションでの利用」は含まれていないとのことです。サポート期間も異なり、Oracle JDKは長期サポートが提供されますが、Oracle OpenJDKは後述するOpenJDKのリリースサイクルに準じて次のバージョンがリリースされるまで(現在は6ヶ月)のみのサポートになります。Oracle JDKを外部向けのアプリケーションで利用したい場合には有償サポートに加入する必要があるとのことです。

他のベンダーでも、Oracle JDKと同様に無償利用できる範囲が制限されていたり、有償でサポート期間の延長や問い合わせ対応などを提供されているケースがあるので、特に商用利用する場合には要件に合ったものを選択するようにしましょう。

バージョンアップの方針とLTS

OpenJDKプロジェクトでは現在、半年に1度、3月頃と9月頃にJDKの新しいバージョンをリリースする方針を採用しています。本稿執筆時点の最新バージョンは2022年3月22日にリリースされたJDK 18で、次のバージョンであるJDK 19は2022年9月20日にリリースされる予定となっています。

OpenJDKでは、各JDKのバージョンのサポート期間を原則として「次のバージョンがリリースされるまで」と定めています。例えば現行のJDK 18は、次期バージョンであるJDK 19が予定通り2022年9月20日にリリースされたら、その時点でサポートが終了します。ここで言うサポートとはバグ修正やセキュリティ対応などを含めたメンテナンスアップデートのことです。サポート期間が過ぎたバージョンについては、たとえ後からバグや脆弱性が発見されたとしても、修正版がリリースされることはありません。そのため、安全なJavaを使い続けていくには常に最新版にアップデートしていく必要があります。

しかし実際のアプリケーション開発では、半年ごとに毎回バージョンを上げていくのは現実的に難しいというケースもあるでしょう。そこで3年(6バージョン)ごとにLTS(Long Term Support)と呼ばれるバージョンが設定されています[2]。LTSバージョンは、数年間(少なくとも次のLTSバージョンがリリースされるまでは)メンテナンスが継続されるため、商用アプリケーションでも安心して利用することができます。本稿執筆時点でリリース済みのLTSバージョンは、2014年リリースのJDK 8と、2018年リリースのJDK 11、そして2021年リリースのJDK 17です。

図2 Javaのリリーススケジュールとサポート期間
図2

現在本番環境で利用されているバージョンはJDK 8またはJDK 11でしょう。JDK 8からJDK 11にかけは大幅な仕様変更が加わっているためなかなか移行が進んでいないという課題があります。その一方で、新規の開発ではJDK 11を採用する企業も増えているようです。JDK 17までくるとかなり魅力的な機能が多数追加されているため、次第に移行が進んでいくことが期待されます。

Javaの仕様はどのように決まっているか

現在のJDKは半年ごとに新しいバージョンがリリースされるという話をしましたが、このバージョンアップではバグ修正だけでなく、新しい機能の追加や、現在ある機能の改善といった機能拡張も行われます。このときにどのような機能拡張が行われるのかは、JDKの開発を行なっているOpenJDKプロジェクトによって決められます。

機能拡張を提案するJEP

もう少し詳しく説明すると、OpenJDKプロジェクトにはJDKの機能拡張を提案するJEP(JDK Enhancement Proposal)と呼ばれる仕組みが用意されています。将来のJDKに導入したい機能拡張のアイデアは、まずOpenJDKプロジェクトにJEPとして申請する必要があります。それぞれのJEPはOpenJDKプロジェクトの中心的なメンバーによってレビューされて、取り組む価値のあるアイデアとして承認されたものに限って実際の開発フェーズに進むことができます。

どのバージョンを導入のターゲットにするのかは、重要度や開発の進行状況、他のJEPとの関連などを考慮して決められます。承認されたJEPを見るとターゲットバージョンが記載されているので、それでどのバージョンでどんな機能が導入される予定になっているのかを知ることができます。

これまでに提案されたJEPのリストは次のページで確認することができます。

https://openjdk.org/jeps/0

また、それぞれのバージョンで導入された、または導入される予定のJEPについては、次の各バージョンごとのページで確認できます。

https://openjdk.org/projects/jdk/

たとえば本稿執筆時点での最新版であるJDK 18では、次に挙げるJEPが追加されました。

  • 400:UTF-8 by Default
  • 408:Simple Web Server
  • 413:Code Snippets in Java API Documentation
  • 416:Reimplement Core Reflection with Method Handles
  • 417:Vector API (Third Incubator)
  • 418:Internet-Address Resolution SPI
  • 419:Foreign Function & Memory API (Second Incubator)
  • 420:Pattern Matching for switch (Second Preview)
  • 421:Deprecate Finalization for Removal

各JEPの詳細ページを確認すれば、機能の概要やターゲットバージョンに加えて、その機能が必要となる動機や基本的な使い方などを知ることができます。

図3 各JEPの詳細ページの例
図3

JEPの中には、名称に「Preview」「Incubator」と付いているものもあります。これはまだ正式に仕様または実装が確定していないプレビュー版という位置付けのJEPで、正式版になる前にテスト的に導入された機能になります。とくに影響の大きな変更については、このように何度かのプレビュー版を経てから正式導入されるようになっています。

Java言語やJVMに関する変更に対しては「Preview⁠⁠、APIやツールに関する変更に対しては「Incubator」という名前が付けられる決まりになっていますが、どちらも同様にプレビュー版だという認識で問題ありません。JDK 18の場合、JEP 420が「Second Preview⁠⁠、JEP 417が「Third Incubator⁠⁠、JEP 419が「Second Incubator」となっています。

PreviewやIncubatorの機能は、プログラムのコンパイル時や実行時に特定のフラグを指定することで使うことができます。ただし、あくまでもプレビュー版であり、正式版になるまでの間に仕様が変更される可能性もあるので注意が必要です。本番環境での使用は推奨さfれていません。

Java SEの仕様策定

さて、JDKの機能拡張がどのように行われるかはわかりましたが、それではその元になるはずの仕様であるJava SEはどのように決まるのでしょうか。

Java SEの仕様策定は、JCP(The Java Community Process)という標準化プロセスによって行われます。JCPにはOrfacleやIBM、Eclipse Foundationなどの主要なベンダやオープンソース団体が参加しており、投票によって最終的な仕様が決定されます。

本来であればまず先にJCPで仕様が決定してから、それに従ってJDKが開発されるのですが、現在は開発速度を優先するために逆の手順が取られるようになっています。すなわち、OpenJDKプロジェクトがJEPをベースとしたプロセスに従って次期バージョンのJDKの開発を進め、それと並行してJCPに仕様の提案を行います。JCPでは、投票によって提案された仕様の承認を行います[3]

たとえば、Java 18についてはJSR 393: Java SE 18として仕様化されています。これはJava 17の仕様に対して、OpenJDK 18に入ることが決定したJEPに関する改訂が反映されたものになっています。

このように、Javaの新機能の開発はまずOpenJDKプロジェクトのJEPからスタートします。したがって、最近追加された新機能や、近い将来追加される予定の機能について知りたい場合には、まずはJEPを確認してみましょう。

Jakarta EEの最新動向

エンタープライズJavaの分野では、Jakarta EEの開発が進んでいます。

先ほど少し触れたように、Javaの言語仕様や標準ライブラリの仕様であるJava SEに対して、より大規模なアプリケーション向けの仕様として「Java EE」があります。

現在、業務アプリケーションの開発で広く使用されているJava EE 8がリリースされたのは2017年9月のことです。その1年後の2018年9月に、それまでJava EEの開発を主導していたOracleは、Java EE 9以降の開発を中止してJava EEに関する成果物をオープンソース化することを発表し、その保守と開発を非営利団体であるEclipse Foundationが引き継ぎました。

このときOracleから寄贈された資産には、Java EE関連のAPIや参照実装であるGlassFishだけでなく、Technology Compatibility Kit(TCK: 互換性試験キット)なども含まれており、これによって互換性の管理も含めてJava EEの開発がコミュニティに委ねられたことになります。ただし、⁠Java」の商標は引き続きOracleが所有するため、オープンソース化後はJava EEという名前を使い続けることができず、⁠Jakarta EE」に名称が変更されました。

Jakarta EEの最初のバージョンであるJakarta EE 8は2019年9月にリリースされました。Jakarta EE 8は、Java EEからJakarta EEへのスムーズな移行を促進するために、Java EE 8と完全な互換性を保つことが優先されています。このために、Jakarta EE 8はJava EE 8とは名称こそ異なるものの、ソースコードの中身はほとんど変更されておらず、まったく同等の機能が維持されています。

Jakarta EE 8に続いて、2020年12月にJakarta EE 9が、2021年5月にはJakarta EE 9.1がリリースされました。Jakarta EE 8では、名称こそ「Java」から「Jakarta」に変更されたものの、互換性のために内部のパッケージ名は「javax.○○」のままになっていました。Jakarta EE 9で、このパッケージ名を一斉に「jakarta.○○」に変更する修正が行われました。それと同時に、既存のアプリケーションを新しいパッケージ名に対応させるための移行ツールも提供されました。

Jakarta EE 9はもともとJava 11での動作をサポートする予定でしたが、この対応がリリースに間に合わなかったため、ベースとするJavaのバージョンはJava 8になっています。これをJava 11をサポートするようにアップデートしたのがJakarta EE 9.1です。本稿執筆時点では、このJakarta EE 9.1が最新版となっています。

図4 Jakarta EEのリリースタイムライン
図4

次期バージョンであるJakarta EE 10は、2022年第2四半期中のリリースを目指して開発が進められていましたが、本稿執筆時点ではまだリリースには至っていません。2022年7月6日時点では、開発メンバーから「あと一歩のところまできている」と報告されています[4]

Jakarta EE 10における大きな変更点としては、まずサポートされるJavaランタイムの最小バージョンがJava 11になるということが挙げられます。Jakarta EE 10はJava 8では動作しないので注意が必要です。Java 17での実行をサポートするかどうかは実装に依存しますが、Jakarta EE 9.1と同様にいくつかのベンダがすでにサポートを表明しています。

機能面での大きな変更としては、⁠Core Profile」と呼ばれる新しいプロファイルの追加を挙げることができるでしょう。これまでのJakarta EEには、フル機能のFull ProfileとWebアプリケーション向けのWeb Profileという2つのプロファイルが用意されていました。

新しく追加されるCore Profileは、主にマイクロサービスの開発および実行を対象として、最低限のAPIのみを含んだサイズの小さなプロファイルとなっています。このCore Profileの提供に合わせて、CDI(Contexts and Dependency Injection)の機能限定版である「CDI Lite」と呼ばれるサブセットが定義されています。

その他にも、各APIでさまざまな変更や機能拡張が行われています。変更点に関するより詳細な情報は、次のリリースプランのページを参照してください。

Jakarta EE 10 Release Plan

Jakarta EE 8から9.1までは、Java EEからのスムーズな移行が最優先されていたため機能面での大きな変更はありませんでした。したがってJakarta EE 10は、Jakarta EEになって初めて本格的な機能拡張が行われるバージョンということになります。新しい仕様の提案も行われており、今後が期待できるリリースになるでしょう。

おすすめ記事

記事・ニュース一覧