OpenJDK 18の正式リリース
OpenJDKは、オラクルが提供するJavaのオープンソース実装版です。2022年3月22日、オラクルよりOpenJDK 18の正式リリース発表がありました。6か月ごとの更新サイクルに基づく最新リリースで、ライブラリー・ツールの機能強化とアップデートを中心とする9つのプラットフォーム機能が強化されています。
【参考】:OpenJDK 18 【参考】:ORACLE Java 18を発表
主要変更点としては、UTF-8がデフォルト文字セットとなることでしょう。この変更で、すべての実装・オペレーティングシステム・ロケール・構成で、一貫性が保証されます。
OpenJDKのリリースとダウンロード
OpenJDKのリリースは、GNU( General Public License, version 2)ライセンスに基づきJDK(Java Development Kit)として実装したもので、今回のリリースは「General-Availability Release」という正式リリース版です。
LinuxのAArch64とx64版、macOSのAArch64とx64版、Windows x64版がビルドリリースされました。モジュールダウンロードは、公式ダウンロードサイトから入手可能です。
【参考】:OpenJDK JDK 18 General-Availability Release 【参考】:Java Downloads
Javaのコミュニティと活動
Javaの仕様は、JSR(Java Specification Requests)により、維持と改善が実施されています。Javaのコミュニティプロセス(JCP:Java Community Process)にしたがって、メンテナンスされています。Java SE 18 PlatformはJSR 393により、規定されています。
【参考】:JSRs: Java Specification Requests 【参考】:Java SE 18 Platform JSR 393
Java SE 18の仕様
Java SE 18の仕様は、JSR(Java Specification Requests)で仕様化されています。JSR 393がJava SE 18の仕様定義で、実際の提供コードやドキュメントはJSR 393に基づき成果物としてまとめられています。 【参考】:Java SE 18 ( JSR 393) Final Release Specification
リリースされた新機能
JDKのリリースは、JDK Enhancement Proposals(JEP)に基づき、リリースされます。 【参考】:JDK 18 Release Notes
ライブラリは、以下の主要な更新と改善がされています。
・JEP 400: UTF-8 by Default 標準Java APIのデフォルト文字セットはUTF-8となります。デフォルトの文字セットを用いるAPIの一貫性が保証されます。
・JEP 408: Simple Web Server 静的ファイルのみを提供するSimple Web Serverを起動するためのコマンドラインツールとAPIが、提供されます。プロトタイピング・アドホックなコーディング・テスト目的を想定しており、特に教育コンテキスト用途で有用です。
・JEP 416:メソッドハンドルによるコアリフレクションの再実装 java.lang.invokeメソッドハンドルの上に、java.lang.reflect.Method・コンストラクタ・フィールドを再実装しました。java.lang.reflectとjava.lang.invoke APIの両方のメンテナンスと開発コストを削減します。
・JEP 418 インターネットアドレス解決SPI ホスト名とアドレス解決のためのサービスプロバイダインタフェース(SPI)を定義することで、java.net.InetAddressがプラットフォームの組み込みリゾルバ以外のアドレス解決リゾルバを使用可能にします。
また、 ツールの改善項目については以下の通りです。
・JEP 413: Java APIドキュメントでのJEP Code Snippets JavaDocのStandard Doclet用の@snippetタグで、API ドキュメントへのサンプルソースコードを組み込みしやすくしました。
続いて、JDK の将来のリリースに向けたプレビューとインキュベータとして、以下のJEPが対応します。
・JEP 417: Vector API (Third Incubator) スケーラブルなベクトル拡張を提供する CPU アーキテクチャの利用API です。
・JEP 419: Foreign Function and Memory API (Second Incubator) JavaプログラムがJavaランタイム外部のネイティブライブラリを呼び、ネイティブデータを処理できるようにします。
・JEP 420 Switchのパターンマッチング(第2回プレビュー) switch式とステートメントのパターンマッチングにより、複雑なデータ指向のクエリを簡潔かつ安全に表現することができます。
ちなみに、Javaプログラムの将来実装についても以下のような記載があります。
・JEP 421 Finalization for Removal を非推奨 Finalization は、テスト実施のために無効とすることができます。今後のリリースではデフォルトで無効化され、将来的には削除される予定です。Finalization に依存しているライブラリやアプリケーションの管理者は、try-with-resources 文やClass Cleanerなどへの移行を検討する必要があります。
リリースされた機能詳細
リリースされた機能の詳細はリリースノートに記載されています。改善項目を以下にまとめました。 【参考】:JDK 18 Release Notes
・SerialGCの文字列重複排除サポート(JDK-8272609) ・ParallelGC の文字列の重複排除サポート(JDK-8267185) ・ZGCの文字列の重複排除サポート(JDK-8267186) ・JEP 420 スイッチのパターンマッチング(セカンドプレビュー) (JDK-8273326) ・ファイラーからJavaFileManagerへの起点要素の受け渡し(JDK-8272234) ・JEP 417:Vector API(サードインキュベータ)(JDK-8269306) ・JEP 419: 外部関数とメモリAPI(第2インキュベータ) (JDK-8274073) ・JEP 418:インターネットアドレス解決SPI(JDK-8263693) ・JEP 408:シンプルWeb サーバー(JDK-8260510) ・Charset.forName() フォールバックのデフォルト値取得(JDK-8270490) ・JEP 400:デフォルトで UTF-8(JDK-8187041) ・java.util.Properties::store メソッドの日付シコメントを制御するシステムプロパティ(JDK-8231640) ・MessagerでのprintError・printWarning・printNoteメソッド(JDK-8273157) ・ElementのJavaFileObjectへのマップ(JDK-8224922) ・Outermost型のエレメント取得(JDK-8140442) ・SourceVersion と Runtime.Version のマッピング(JDK-8275308) ・Compilation Replayの改善(JDK-8254106) ・設定可能なカードテーブルVMオプション(JDK-8272773) ・G1ヒープリージョンを512MBまで拡大(JDK-8275056) ・Finalization向けJDK Flight Recorder Event(JDK-8266936) ・SunPKCS11 プロバイダーのPKCS#11 v3.0 API の部分的サポート(JDK-8255409) ・Security Manager API非依存のSubject.getSubject・doAs API(JDK-8267108) ・keytool と jarsigner コマンドに-versionオプションを追加(JDK-8272163) ・KeyStoreにgetAttributesメソッドを追加(JDK-8225181) ・PKCS12 KeyStore保存時にStore PasswordをNullに設定可能(JDK-8231107) ・JKSからパスワード不要KCS12 へcacert を移行(JDK-8275252) ・OCSPレスポンスにおけるRSASSA-PSSサポート(JDK-8274471) ・PKCS11ライブラリでSunPKCS11プロバイダのKW・KWPモード付きAES暗号サポート(JDK-8264849) ・javacのserial lint warningの拡張チェック(JDK-8202056) ・ドキュメントにスクリプトファイルを含めるオプション(JDK-8275786) ・JEP 413: Java API ドキュメントにおけるCode Snippets(JDK-8201533) ・DocLint メッセージへの@SuppressWarnings追加(JDK-8189591)
削除された機能およびオプションについても気になるところですが、同リリースノートに詳しく記載されています。必要に応じてご確認をおすすめします。
Java SE 17と Java SE 18の違い
Java SE 17と Java SE 18の違いについては、JSR 393: Java SE 18のAnnex 2に記載されています。具体的には、以下のリンクにコンパイルした際の差異について記載されています。 【参考】:JavaTM Platform, Standard Edition API Differences between Java SE 17 (build 35) & Java SE 18 (build 37)
Java SE 18 APIの詳細については、以下のリンクに掲載されています。バージョンアップやコード移行時に参考にするのが良いでしょう。 【参考】:Java® Platform, Standard Edition Version 18 API Specification
JDKの定期更新に期待しましょう
OpenJDKは、オラクルが提供するJavaのオープンソース実装版です。残念ながらオラクル版ではLTSには対応していませんが、6か月周期でのリリースが期待できます。次期リリースとなるOpenJDK 19はすでに開発を始めています。最新テクノロジーを追求したい方には、特に最新情報入手をおすすめします。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから