🍇

1.3 Javaのエディションとバージョン(Java SE、Jakarta EE、リリースモデル、LTSなど)~Java Basic編

2023/11/05に公開

はじめに

自己紹介

皆さん、こんにちは、Udemy講師の斉藤賢哉です。私はこれまで、25年以上に渡って企業システムの開発に携わってきました。特にアーキテクトとして、ミッションクリティカルなシステムの技術設計や、Javaフレームワーク開発などの豊富な経験を有しています。
様々なセミナーでの登壇や雑誌への技術記事寄稿の実績があり、また以下のような書籍も執筆しています。

いずれもJava EEJakarta EE)を中心にした企業システム開発のための書籍です。中でも 「アプリケーションアーキテクチャ設計パターン」は、(Javaに限定されない)比較的普遍的なテーマを扱っており、内容的にはまだまだ陳腐化していないため、興味のある方は是非手に取っていただけると幸いです(中級者向け)。

Udemy講座のご紹介

この記事の内容は、私が講師を務めるUdemy講座『Java Basic編』の一部の範囲をカバーしたものです。『Java Basic編』はこちらのリンクから購入できます(セールス対象外のためいつも同じ価格)。また定価の約30%OFFで購入可能なクーポンをZenn内で定期的に発行していますので、興味のある方は、ぜひ私の他の記事をチェックしてみてください。

この講座は、以下のような皆様にお薦めします。

  • Javaの言語仕様や文法を正しく理解すると同時に、現場での実践的なスキル習得を目指している方
  • 新卒でIT企業に入社、またはIT部門に配属になった、新米システムエンジニアの方
  • 長年IT部門で活躍されてきた中堅層の方で、学び直し(リスキル)に挑戦しようとしている方
  • 今後、フリーランスエンジニアとしてのキャリアを検討している方
  • Chat GPT」のエンジニアリングへの活用に興味のある方
  • Oracle認定Javaプログラマ」の資格取得を目指している方
  • IT企業やIT部門の教育研修部門において、新人研修やリスキルのためのオンライン教材をお探しの方

この記事を含むシリーズ全体像

この記事はJava SEの一部の機能・仕様を取り上げたものですが、一連のシリーズになっており、シリーズ全体でJava SEを網羅しています。また認定資格である「Oracle認定Javaプログラマ」(Silver、Gold)の範囲もカバーしています。シリーズの全体像および「Oracle認定Javaプログラマ」の範囲との対応関係については、以下を参照ください。

https://zenn.dev/kenya_saitoh/articles/3fe26f51ab001b

1.3 Javaのエディションとバージョン

チャプターの概要

このチャプターでは、Javaの3つのエディションや、Javaがバージョンアップのたびにどのような機能を追加してきたのかについて学びます。

1.3.1 Javaのエディション

Javaには、用途や利用目的に応じて、3つの標準的なエディションがあります。それぞれのエディションでは、クラスライブラリ(API)と、その目的に応じた開発および実行環境が提供されます。

Java SE(Java Platform, Standard Edition)

Java SEとは、Javaプログラムを開発・実行するための環境と、Javaの最も基本となるクラスライブラリを提供するエディションです。
クラスライブラリとしては、文字列を表すjava.lang.Stringクラスや、数値を表すjava.lang.Integerクラスなど、言語本体とも言うべき機能が含まれています。

Java EE(Java Platform, Enterprise Edition)

Java EEとは、企業システム向けのJavaアプリケーションを実行するための環境と、それらを開発するためのクラスライブラリを提供するエディションです。
なおJava EEは、もともとはOracle社が権利を有していましたが、2017年にオープンソース化され、「Jakarta EE」と名称が変更になったため、現在では「Java EE」という呼び方は使われなくなっています。

Java ME(Java Platform, Mobile Edition)

Java MEとは、モバイル端末向けのJavaアプリケーションを実行するための環境と、それらを開発するためのクラスライブラリを提供するエディションです。
なおJava MEは、リソースに制約のあるモバイル端末のための最小構成のエディションでしたが、昨今ではモバイル端末の性能向上により、Java SEが問題なく動作するようになったため、Java MEは使われなくなりました。

1.3.2 Javaのリリースモデル

Java(=Java SE)は初期バージョンは1995年に発表されていますが、その後バージョンアップを重ね、2022年6月時点の最新バージョンはJava 18です。
ここでは、Javaがどのようなリリースモデルを採用しているのかを説明します。

Javaのリリースモデル

Javaのリリースモデルは当初、次期バージョンに取り込むべき機能をまず決めて、その機能の開発が終わり次第リリースする、というものでした。ただしこのモデルでは、新機能の開発に想定以上の期間を要してしまった場合、必然的に次期バージョンのリリースが遅れてしまい、Javaという技術全体の進化までも停滞しがちになる、という結果を招いていました。
そこで2017年9月にリリースされたJava 9からは、まずリリースの時期を決め、そこに含めることができる機能のみを次期バージョンに取り込む、というリリースモデルに変更されました。このモデルではリリースサイクルが半年となったため、Java 9以降、バージョン番号のカウントアップが急に速まったように感じることでしょう。
ただし半年ごとにリリースされるすべてのバージョンをメンテナンスすることは困難なため、3年ごと、すなわち6バージョンごとにリリースされるバージョンを、LTS(Long Term Support)と設定し、長期サポートの対象としています。企業システムでの利用など、長期のサポートが求められる場合は、LTSを選択することになるでしょう。

Javaのバージョンとリリース日

Javaのバージョンとリリース日、そしてLTS対象については、以下の表のようになっています。

【表1-3-1】Javaのバージョン・リリース日・LTS対象

バージョン リリース日 LTS対象かどうか
Java 8 2014年3月 対象
Java 9 2017年9月
Java 10 2018年3月
Java 11 2018年9月 対象
Java 12 2019年3月
Java 13 2019年9月
Java 14 2020年3月
Java 15 2020年9月
Java 16 2021年3月
Java 17 2021年9月 対象

1.3.3 Javaのバージョンと主要な機能

ここではJava 5以降のバージョンアップにおいて、どのような機能が追加されてきたのか、主要な機能に絞って整理します。
なおここに出てくる各機能については、後続のチャプターや「レッツラーンシリーズ」の別コースにて詳細を説明しますので、この時点では内容を把握する必要はありません。

Java 5

• 拡張for文
• オートボクシング
• staticインポート
• 可変長パラメータ
• 総称型
• 列挙型
• アノテーション

Java 7

• 数値セパレーター
• switch文の文字列対応
• マルチキャッチ
• リソースの自動クローズ
• Java NIO.2(java.nio.file API)

Java 8

• インタフェースにおけるデフォルトメソッドとスタティックメソッド
• 関数型インタフェース
• ラムダ式
• メソッド参照
• ストリームAPI
• Date and Time API
• Optionalクラス

Java 9

• モジュールシステム
• jshell

Java 10

• ローカル変数の型推論(varキーワード)

Java 11

• HTTPクライアントAPI

Java 12

• switch文の拡張(case句に複数値を記述可能に)

Java 14

• switch式(値を返すswitch文)

Java 15

• テキストブロック

Java 16

• レコードクラス
• instanceofのパターン・マッチング

本コースが前提とするバージョン

本コースでは、2022年6月時点における最新のLTSであるJava 17を前提とした解説を行っていきます。ただしJava 17はリリースからの日も浅く、世の中ではまだまだJava 8やJava 11が現役で利用されています。そのため、Java 9以降のバージョンで追加された機能を説明する際は、どのバージョンで追加された機能なのかを明示するようにしています。
適宜、受講生の皆さんが利用する想定のバージョンと比較をしながら、コースを進めてください。

1.3.4 Java SEクラスライブラリの全体像

Java SEクラスライブラリの主要なモジュールとパッケージ

ここでは、Java SEのクラスライブラリにおける主要なモジュールとパッケージを、まとめて紹介します。なおモジュールについては『Java Advanced編』で、パッケージについてはチャプター9.1で詳細を説明しますが、ここではいったんクラスを分類するためのグループと理解しておけば問題ありません。

【表1-3-2】Java SEクラスライブラリの主要なモジュールとパッケージ

モジュール パッケージ 説明 本シリーズにおける主な参照先
java.base java.lang Java言語として最も基本的な機能を提供するクラス シリーズ全体で使用
java.util コレクションフレームワークを初めとした様々なユーティリティクラス 『Java Basic編』チャプター19.1~19.2
java.util.regex 正規表現のためのクラス 『Java Basic編』チャプター16.2
java.text 数値や日時をフォーマッティングしたり解析したりするためのクラス 『Java Basic編』チャプター17.1、20.1
java.time Date and Time APIにおいて、日付と時間などを表すクラス 『Java Basic編』チャプター20.2
java.time.temporal Date and Time APIにおいて、日付や時間の単位表現や計算を行うクラス 『Java Basic編』チャプター20.2
java.time.format Date and Time APIにおいて、日付と時間をフォーマッティングしたり解析したりするクラス 『Java Basic編』チャプター20.2
java.util.concurrent 並行処理ユーティリティ(Concurrency Utilities)でサポートされたクラス 『Java Advanced編』チャプター3.2~3.3
java.util.concurrent.locks ロックの機能を提供するクラス 『Java Advanced編』チャプター3.1
java.util.concurrent.atomic アトミックを保証クラス 『Java Advanced編』チャプター3.3
java.util.function 関数型インタフェース(ラムダ式やメソッド参照で実装) 『Java Advanced編』チャプター4.1
java.util.stream StreamクラスなどストリームAPIの主要なクラス 『Java Advanced編』チャプター4.2
java.io ファイル、データ、直列化など入出力のためのクラス 『Java Advanced編』チャプター5.1、5.2
java.net ネットワーク通信のための基本的なクラス 『Java Advanced編』チャプター6.1
java.nio Java NIO全体で使用するクラス 『Java Advanced編』チャプター5.1、6.1
java.nio.file Java NIO.2において、ファイルを操作するためのクラス 『Java Advanced編』チャプター5.1
java.nio.channels Java NIOにおいて、チャネルを表すためのクラス 『Java Advanced編』チャプター6.1
java.nio.charset Java NIOにおいて、文字コードを表すためのクラス 『Java Advanced編』チャプター6.1
java.lang.reflect リフレクションのためのクラス 『Java Advanced編』チャプター8.2
java.lang.annotation アノテーションの機能を提供するためのクラス 『Java Advanced編』チャプター8.3
java.net.http java.net.http HTTPクライアントAPIでサポートされた、HTTP通信用のクラス 『Java Advanced編』チャプター6.2
java.sql java.sql データベースアクセス(JDBC)のためのクラス 『Java DBアクセス編』予定
java.xml org.w3c.dom Document Object Model(DOM)のインタフェース
javax.xml.parsers DOMを使用してXML文書を処理するためのクラス
javax.xml.stream Streaming API for XML(StAX)のインタフェースとクラス
javax.xml.stream.events Streaming API for XML(StAX)のイベントを表すインタフェース
javax.xml.xpath XPath式のためのAPIを提供するクラス

このようにJava SEのクラスライブラリをモジュールおよびパッケージという観点で俯瞰すると、歴史的な経緯もあり、パッケージの粒度にはばらつきがあることに気が付きます。例えばjava.utilパッケージは、コレクションフレームワークが包含されているのを初め、壮大なパッケージになっています。それに対してJava NIOでサポートされたクラスは、機能ごとにパッケージが細分化されています。
要は、パッケージのラインアップ数と提供される機能の大きさとは必ずしも比例するわけではない、と理解した方が良いでしょう。

このチャプターで学んだこと

このチャプターでは、以下のことを学びました。

  1. Javaには、Java SE、Java EE(Jakarta EE)、Java MEという3つのエディションがあること。
  2. JavaのリリースモデルとLTSの考え方について。
  3. Java 5以降、どのような機能が追加されてきたのか。
  4. Java SEクラスライブラリの全体像について。

Discussion