Javaの開発に関する基本情報のおさらい

現在、Javaの仕様策定はJCP(Java Community Process)によって行われている。そのうち、コア機能であるJava SEについては、オープンソースのOpenJDKプロジェクトによって参照実装(標準仕様を網羅した基準となる実装)の開発が行われる。

OpenJDKプロジェクトにはOracleだけでなく多くの企業や個人開発者が参加しており、JVMやJavaコンパイラ、Java APIのライブラリなどを提供している。Javaプログラムの開発に必要なこれらの開発ツールセットをJDK(Java Development Kit)と呼び、OpenJDKプロジェクトによって提供されているJDKはOpenJDKと呼ばれている。

Oracleは、OpenJDKとは別に独自のプロダクトとしてOracle JDKと呼ばれるJDKを提供している。これはOpenJDKをベースに、Java Web Startのようなデスクトップ機能や、Flight RecorderやMission Controlのような商用機能、インストーラなどを追加したものだ(ただし、後述のようにJDK 11以降は、OpenJDKと機能上は同一となっている)。Oracle JDKには無償版と有償版がある。

JDKには、Oracle JDK以外にもOpenJDKをもとに独自にバイナリをビルドして提供されているものがある。AdoptOpenJDKZuluRed Hat OpenJDKなどがその代表的なものである。

(注:Javaの標準仕様にはJava SEのほかにJava EE(Jakarta EEに移行済み)やJava MEがあるが、本連載ではJava SEのみを扱う。以後、Java 9やJava 11という記述は、すべてJava SE 9やJava SE 11を指すものとする)

Java 9以降で変わったリリースサイクル

Java 8までは、Javaのバージョンアップは数年に1度であり、その都度多くの新機能が追加される大型のアップデートとなっていた。しかし、そのようなスローなリリースサイクルでは、現在の市場の変化に追いつけないという問題を抱えていた。そこで、Java 9以降は6カ月ごとに実装が完了している機能からリリースし、間に合わなかったものは次回以降のバージョンに回すという、期間ベースのリリースサイクルに変更された。

ここで気をつけなくてはならないのが、各バージョンのサポート期間だ。OpenJDKプロジェクトでは、最新バージョンのみバグフィックスやセキュリティパッチなどの提供を行い、次のバージョンがリリースされたら古いバージョンはメンテナンスしない方針となっている。

新バージョンは6カ月ごとにリリースされるので、開発・実行環境をセキュアに保つには、常に最新のバージョンに追随していかなければならないことになる。これが、最新のJava技術の動向に注目するべき大きな理由にもなっている。

Oracle JDKについても、OpenJDKのリリースに合わせて最新版のバイナリビルドが提供されるが、これも無償サポートはOpenJDKと同様に最新バージョンに対してのみしか提供されない。ただし、Oracle JDKの場合は3年に1度、有償で長期間サポート付きのLTS(Long Term Support)版がリリースされる。2020年1月現在の最新のLTS版はOracle JDK 11で、次は2021年9月にリリース予定のOracle JDK 17となる。詳細はOracle Java SE サポート・ロードマップを参照いただきたい。

  • OpenJDKとOracle JDKのリリースモデル

    OpenJDKとOracle JDKのリリースモデル

なお、Oracle以外のJDKのベンダーも独自のサポートポリシーを打ち出しており、LTS版の提供も行っている。中には、特定のプラットフォームで利用する場合のみ無償の長期サポートが受けられるというようなケースもある。

例えば、Rad Hat OpenJDKは、Red Hat Enterprise Linux上で使う場合、(RHELサブスクリプションにJDKのサポートも含まれるため)追加料金なしで長期サポートを受けることができる。このようにベンダーやプラットフォームごとにサポートポリシーが異なるため、特に本番環境で使用するJDKは注意深く選択する必要がある。

OpenJDKプロジェクトをチェックしよう

前述のように、現在Javaのコア開発の開発を担っているのはOpenJDKプロジェクトである。OpenJDKプロジェクトでは、将来のJavaへの導入が検討される機能要望が「JEP(JDK Enhancement Proposals))」という形でまとめられている。新機能の要望がJEPとして認可されたら、その機能の重要性やほかのJEPとの依存関係などを考慮して優先度が付けられ、担当者やターゲットとするJDKのバージョンなどが協議され、正式にJavaに統合するための開発が進められる。

JEPの情報はこのページで公開されている。それぞれのJEPのターゲットとなるJDKバージョンを確認すれば、将来のJavaにどのような機能が追加されるのかがある程度見えてくる。

例えば、2020年3月にリリース予定のJDK 14をターゲットとしたJEPとしては以下が挙げられている。

  • 305: Pattern Matching for instanceof (Preview)
  • 343: Packaging Tool (Incubator)
  • 345: NUMA-Aware Memory Allocation for G1
  • 349: JFR Event Streaming
  • 352: Non-Volatile Mapped Byte Buffers
  • 358: Helpful NullPointerExceptions
  • 359: Records (Preview)
  • 361: Switch Expressions (Standard)
  • 362: Deprecate the Solaris and SPARC Ports
  • 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector
  • 364: ZGC on macOS
  • 365: ZGC on Windows
  • 366: Deprecate the ParallelScavenge + SerialOld GC Combination
  • 367: Remove the Pack200 Tools and API
  • 368: Text Blocks (Second Preview)
  • 370: Foreign-Memory Access API (Incubator)

注意してほしいのは、JEPはあくまでも提案であり、JEPに登録されたからといって、将来のJavaに必ず追加されるとは限らないという点だ。また、JEPの採用/不採用はOpenJDKプロジェクト内で検討されるが、各Javaバージョンの最終的な仕様の決定は従来通りJCPによって行われる。例えば、Java 14の場合は、JSR 389として標準化プロセスが進められている。

本連載では、このJEPを追いながら、Java 9以降に追加された新機能を紹介していこうと思う。