そもそもJavaとはどんなプログラミング言語か
Javaは、サン・マイクロシステムズ(後にOracleが買収)が1995年にα版・β版をリリースし、1996年に市場リリースされたオブジェクト指向のプログラミング言語です。その最大の特徴は、「Write Once, run Anywhere(一度書けば、どこでも実行できる)」という思想にあります。これは、Javaで書かれたプログラムがWindows、macOS、Linuxなどといった特定のOSやCPUアーキテクチャに依存せず、Javaの実行環境さえあればどこでも同じように動作することを意味します。
このプラットフォームに依存しない仕組みを実現しているのが、後述するJVM(Java Virtual Machine)です。 Javaは、その堅牢性、安全性、高いパフォーマンス(特にサーバーサイドでの長時間稼働)、そして豊富なライブラリ群により、世界中の様々な分野で利用されています。
|
エンタープライズ システム開発 |
金融機関の勘定系システム、企業の基幹業務システム(ERP)、 顧客管理システム(CRM)など、高い信頼性と 大規模トランザクション処理が求められる分野で 圧倒的なシェアを誇ります。 |
| Webアプリケーション開発 |
サーバーサイドプログラミングのデファクトスタンダードの 一つであり、Spring Framework(特にSpring Boot)などの 強力なフレームワークと共に、ECサイト、SNS、 ポータルサイトなど、あらゆるWebサービスの バックエンド開発に用いられています。 |
|
Android アプリケーション開発 |
スマートフォンのOSであるAndroidの公式開発言語の一つ (現在はKotlinも主流)であり、世界中の何十億台もの デバイスで動作するアプリ開発の基盤となっています。 |
| ビッグデータ処理 |
Apache HadoopやApache Sparkといった、大量のデータを 分散処理するための主要なフレームワークがJava (またはJavaと互換性のあるScala)で記述されており、 データ分析基盤の中核を担っています。 |
| 組み込みシステム |
高機能な家電製品、カーナビゲーションシステム、 産業用コントローラーなど、特定の機能を持つ デバイスの制御にも利用されています。 |
これほどまでに広く使われ続けている理由は、単なるプラットフォーム非依存性だけではありません。Javaの信頼性と生産性は、強力な静的型付け言語であることによるコンパイル時のエラーチェックの恩恵、ガベージコレクションによるメモリ管理の自動化、豊富な標準API、そして世界中に広がる巨大な開発者コミュニティとエコシステムによって支えられています。ITエンジニアにとって、Javaは特定のアプリケーション領域に留まらない、広範なキャリアパスを切り開く可能性を秘めた、今なお学ぶ価値の非常に高い言語であると言えるでしょう。
Java関連用語の多さと初心者が抱きがちな疑問
Javaを学び始めたり、開発環境を構築しようとしたりすると、「JVM」「JRE」「JDK」「Java SE」「VM」「OpenJDK」「Oracle JDK」といった類似する専門用語・略語にたくさん出くわします。特に初学者は違いがわかりづらく混乱するでしょう。よく挙げられる疑問としては、次のようなものがあります。
- 「Javaを動かしたいだけなのに、JDKとJREのどっちをインストールすればいい?」
- 「JVMとJREって、結局何が違うの?」
- 「Java SEとJava EE(Jakarta EE)は、まったく別の言語なの?」
- 「OpenJDKとOracle JDKは、機能が違うの? どっちを使えば無料なの?」
- 「ダウンロードページにJava 8、11、17、21……とたくさんあるけど、どれを選べばいい?」
これらの疑問は、Javaの全体像や各コンポーネントの関係性を理解していないために生じます。それぞれの単語を理解し、疑問をなくすため、まずはJavaの仕組みや多くの用語が存在する理由から紐解いていきましょう。
| 1 |
役割の細分化 |
Javaの「Write Once, Run Anywhere」を実現するため、プログラミング用語のJavaは役割ごとにコンポーネントが明確に分離されています。端的に言えば、「実行する仕組み(JVM)」「実行に必要な環境(JRE)」「開発に必要な道具一式(JDK)」ですが、詳細は後述します。 |
| 2 |
歴史的経緯と ブランディング |
Javaは長い歴史の中で、Sun MicrosystemsからOracleへと主要な管理元が移り変わりました。また、技術の進化にともない、機能が追加・分離されてきました。こうした経緯が、用語の多様化につながっています。 |
| 3 |
エディション(種類) の存在 |
Javaは一つの技術仕様ではなく、利用目的に応じて複数の「エディション」が定義されています。最も標準的な「Java SE」のほかに、大規模システム向けの「Jakarta EE(旧Java EE)」などが存在し、それぞれが異なる仕様とAPI群を持っています。 |
| 4 |
提供元 (ディストリビューション) の多様性 |
Javaの核となる部分はオープンソース(OpenJDK)として開発されています。そのため、Oracleだけでなく、Red Hat、Amazon、Eclipse Foundation、Microsoftなど、多くのベンダーが独自のサポートやライセンスポリシーを付け加えて「JDKディストリビューション」として提供しています。 |
重要なのは、用語が使われている「文脈」とその背景にある「分類」の理解です。ここからは、鍵となる「3つの軸」について解説します。
Java関連用語を効率的に理解するには
役割・種類・提供元を意識する
ITエンジニアとしてJavaというプログラミング言語・技術を正しく理解し、使いこなすには、単語を暗記するだけでなく、それらがJavaエコシステム全体の中でどのような位置づけなのかを知るのが不可欠です。その理解に役立つ3つの軸を、ここから説明します。
1. 役割の違いを意識する(動かすvs作る)
そもそも、Javaには大きく分けて「実行するため(動かすため)」「動かす心臓部(実行エンジン)」「開発するため(作るため)」「プログラムを一つにまとめた箱(ファイル)」が存在します。使う目的によって道具や部品が用意されており、それぞれが異なる役割を担っています。
|
JRE (Java Runtime Environment) |
Javaアプリケーションを「実行するため(動かすため)の環境」です。 JVM本体も最初からここに含まれています。 イメージしやすいものにたとえると、JREは“ゲーム機本体”です。 |
|
JVM (Java Virtual Machine) |
Javaを「動かす心臓部(実行エンジン)」です。 一般的に「VM」とだけ呼ばれる場合も、Javaの文脈ではJVMを指すことが多いです。 JREを“ゲーム機本体”とした場合、JVMはその中に入っている高性能エンジンにたとえられます。 |
|
JDK (Java Development Kit) |
Javaアプリケーションを「開発するため(作るため)の道具」一式です。 JREや後に説明する開発ツール(コンパイラやデバッガ)もここに含まれています。 ゲーム機本体(JRE)とプロ向けの開発キットが入っていると考えると、わかりやすいかもしれません。 |
|
JAR (Java Archive) |
開発者がJDKで作った「プログラムを一つにまとめた箱(ファイル)」です。 JARは、JRE(ゲーム機)で動くゲームソフトと考えると理解しやすいでしょう。 |
2. 種類の違いを理解する(標準版vsエンタープライズ版vs見た目用の部品)
Javaには主に3つの種類があり、「どんなアプリを作るか」によって選択するものが変わります。
| Java SE |
「SE(Standard Edition)」と名前に入っているように、 最もスタンダードなJava(標準仕様)です。 デスクトップアプリや小規模サーバーアプリなど、 あらゆるJavaアプリケーションの基盤となります。 1. で説明した各要素は、この仕様に基づいています。 |
|
Jakarta EE (旧 Java EE) |
「EE(Enterprise Edition)」と付いているように、 エンタープライズ(大規模な企業・事業向け)用のJavaです。 Java SEを基盤としていますが、銀行のシステムや ショッピングサイトなど、大きな仕組みを作れるよう、 拡張機能が数多く盛り込まれています。 |
| JavaFX |
デスクトップアプリの見た目(ボタンや入力欄、 グラフなどの画面)を作るための部品セット(ライブラリ)です。 GUI(グラフィカル・ユーザー・インターフェース)を持つため、 デザイン性あるものを作ることができます。 以前はJava SEの標準機能としてJDKに同梱されていましたが、 現在はライブラリとして別々に提供されています。 「Java SEで作った料理を、JavaFXで装飾する」とたとえると、 理解しやすいでしょう。 |
3. 提供元(ディストリビューション)の違いを理解する
Javaアプリケーションを開発する際に必要なJDKは、実は様々な企業が配布しています。基準(参照実装)となるOpenJDKはオープンソース(GPLライセンス)で公開されており、あらゆるJDKディストリビューションの基礎となっています。Oracle JDKは、GPLライセンスに基づいて Oracle社が提供しているもので、Oracleによるサポートや追加機能(かつては存在)が提供されていました。つまり、わかりやすくまとめると、OpenJDKとOracle JDKは次のような関係性にあるということです。
- OpenJDK:誰でも自由に使える原型(Javaの設計図)
- Oracle JDK:Javaの元々の開発元であるOracleが、設計図をもとに製品として配布しているJDK
JDKは、Oracle JDK以外にも様々存在します。Amazonが提供する「Amazon Corretto」、Eclipse Foundationが提供する「Eclipse Temurin(旧 AdoptOpenJDK)」、Microsoftが提供する「Microsoft Build of OpenJDK」、Azul Systemsが提供する「Azul Zulu」、IBM傘下のRed Hatが提供する「Red Hat build of OpenJDK」といったように、各社がJava SEの仕様に準拠しながらサポート期間、ライセンス、最適化されている環境に特徴を持ったJDKを提供していますので、名前だけでも覚えておくと理解がスムーズになるはずです。
Java関連用語を「役割による違い」から解説
役割・種類・提供元の3軸で、Javaエコシステムの関係性はある程度理解できたかと思います。次は、さらにそれぞれの用語をさらに正確に把握するため、詳細を説明していきます。
JREとは
「Java Runtime Environment」の略称であるJRE。日本語では「Java実行環境」と呼ばれており、Javaアプリケーションを実行するために必要な次の2つの要素で主に構成されています。
- JVM
- コア・ライブラリ(Java標準クラスライブラリ)
コア・ライブラリとは、Javaプログラムが動作するために必要な基本的な部品群(クラスやインターフェースの集まり)を指します。「画面に文字を出す」「インターネットに接続する」「ファイルを開く」などといった、どんなアプリでも使う共通の機能が搭載されていると考えるとわかりやすいでしょう。「Java API」と呼ばれることもあります。なお、Javaで開発されたサーバー上で動作するプログラムやデスクトップアプリケーションは、JREがインストールされていないコンピュータでは実行できません。
JVMとは
「Java Virtual Machine」を略したJVMは、Javaの最大の特徴である「Write Once, Run Anywhere」を実現する中核的なコンポーネントです。 現実のコンピュータ(物理マシン)がWindows、macOS、LinuxといったOS上で動作するのに対し、JVMはそれらのOSの上で動作する「仮想的なコンピュータ」として振る舞います。「Java専用の通訳&実行係」と捉えるとわかりやすいかもしれません。
アプリケーションを実行する際、JVMがこのJavaバイトコードを解釈し、実行時にWindows、macOS、Linuxなど該当するOSのネイティブコードに変換しながら実行します。この仕組みがあることで、開発者はOSの違いを意識することなく、Javaバイトコードを生成するだけでプログラムを動作できます。
また、JVMは通訳だけでなく片付け(メモリ管理)も自動で行ってくれます。プログラムが動いた際にメモリに置かれた様々なデータの中から、不要なデータを自動で見つけて片付けてくれる「ガベージコレクション」の仕組みを持っているため、エンジニアはプログラムの中身(ロジック)を書くことに集中できます。
JDKとは
「Java Development Kit」を略したJDKは、日本語では「Java開発キット」と訳されます。その名の通り、Javaアプリケーションを「開発するために」必要なツール一式をまとめたパッケージです。
JDKには、大きく分けて「JRE(実行環境)」と「開発ツール」の2つが含まれています。それぞれの役割を整理したので、確認してみましょう。
- JRE:開発したアプリを「テスト実行する」ために使います。
- 開発ツール:アプリケーションを開発するために必要な専門道具です。
-
javac(コンパイラ):Javaソースコード(
.javaファイル)をJavaバイトコード(.classファイル)にコンパイルするツール - java(ランチャー/実行コマンド):JVMを起動し、指定されたJavaバイトコードを実行するツール。JREにも含まれています
-
jar(アーカイブ):複数の
.classファイルや設定ファイルを一つのファイル(JARファイル)にまとめるツール - javadoc(ドキュメント生成):ソースコード内のコメントから、プログラムの仕様書(APIドキュメント)を自動生成するツール
開発者(プログラマー)は、これらを使ってアプリケーションを開発し、それがエンドユーザーの環境(JRE)で正しく動作するかをテストします。もしJREに含まれていない特殊なライブラリ(外部ライブラリ)を使用する場合は、それらのライブラリファイル(jarコマンドでまとめたJARファイルなど)も一緒に配布する必要があります。
Javaの開発プロセスでは、まずプログラマーがJDKに含まれるコンパイラ(javac)を使ってソースコード(.javaファイル)をコンパイルし、javaコマンドでテスト実行します。これらを使って、自分が作成したアプリケーションがエンドユーザーの環境にあるJREの機能で正しく動作するかを確認するのは、開発者(プログラマー)の大事な仕事の一つです。もしJREに含まれていない特殊なライブラリ(外部ライブラリ)を使用する場合は、それらのライブラリファイル(jarコマンドでまとめたJARファイルなど)も一緒に配布する必要があります。
JRE・JVM・JDKの関係性まとめ
ここまで説明したJRE、JVM、JDKの関係は、ロシアの人形・マトリョーシカのような「入れ子構造」で考えるとわかりやすいでしょう。JDKが一番外側の大きな箱で、その中に実行セットのJREが、そしてJREの中に核となるエンジンのJVMが含まれています。エンジニアは、JDKをインストールすれば、Javaアプリの作成から実行までを行うことが可能です。
JARとは
JARは「Java Archive」の略称で、開発者がJDKで作ったJavaアプリのプログラムを一つにまとめた箱(ファイル)です。JDKで作ったゲームソフト=JARファイル(拡張子は.jar)とたとえるとわかりやすいでしょう。
Javaアプリは通常、.classファイルや画像、設定ファイルなどたくさんの部品で構成されています。これらがバラバラだと利用者に渡すのも管理も大変です。そこで、JDKに含まれるコマンドjar(アーカイブ)を使って、すべてを一つにまとめます。これがJARの主な役割です。
JARの主な役割
JARの役割をさらに詳しく説明すると、次の2つに分けることができます。
|
アプリケーション として実行する |
直接実行できるJARを「実行可能JAR」と呼びます。 Javaアプリの利用者はこれを手に入れ、JREで動かします。
「どこからプログラムを始めればいいか(mainメソッド)」が 書かれているため、すぐに起動できる便利な形式です。 |
|
他のプログラムの 部品として使う |
カレンダー機能やグラフ表示機能といったように、 便利な機能だけをJARに詰めておき、ほかの開発者が 自分のアプリに部品として組み込むことも可能です。 これは「ライブラリ」と呼ばれます。 |
なお、JARファイルの実体はZIPファイルと同じ形式であるため、ZIP解凍ソフトで中身を見ることも可能です。
Java関連用語を「種類による違い」から解説
前項では、Javaのプログラムにおける「役割の違い」から関連用語を解説しました。ここからは、利用されるシステムの規模や用途に応じて選ばれる「種類(エディション)」について細かく説明します。
Java SEとは
Java SE(Java Platform, Standard Edition)は、いわゆる「標準仕様」のエディションで、一般的に「Java」と言われるものの多くはこれを指しています。Java SEは、デスクトップアプリケーション、小〜中規模のサーバーアプリケーション、組み込みシステムなど、あらゆるJavaアプリケーション開発の基盤となります。これまで出てきたJRE、JVM、JDKは、このJava SEの仕様を実装したものです。
Java SEは、次のような内容を定義しています。
- Java言語仕様:プログラミング言語「Java」の文法やルールそのもの
- JVM仕様:「Javaバイトコードがどのように実行されるべきか」といったJava仮想マシンの仕様
-
Java SE API:Java開発者が共通して利用できる基本的なAPI(クラスやインターフェースの集まり)の仕様。次のような要素が含まれています。
-
java.lang:文字列(
String)、数値、スレッドなど、言語の根幹をなすクラス - java.io / java.nio:ファイル入出力やバッファ操作のためのクラス
- java.net:ネットワーク通信(TCP/IP, HTTPなど)のためのクラス
- java.util:リスト(List)、マップ(Map)、セット(Set)などのコレクションフレームワークや、日付(Date)、乱数などのユーティリティクラス
- java.sql:データベース接続(JDBC)のためのクラス
-
java.lang:文字列(
など
Java SEは「Java SE 8」「Java SE 11」「Java SE 17」「Java SE 21」といったようにバージョンアップを重ねており、新しいバージョンでは、言語仕様の改善(ラムダ式、レコードクラスなど)や、新しいAPIの追加が行われています。エンジニアがJavaを学習する際は、まずJava SEの仕様(言語文法と標準API)を学ぶところから始めましょう。
Jakarta EE(旧Java EE)とは
Jakarta EE(Jakarta Enterprise Edition)は、Java SEを土台(基盤)とした上にエンタープライズ(大規模企業・事業向け)Webアプリケーションや分散システムを構築するために必要なより高度な機能(API)を追加した仕様群です。かつては「Java EE(Java Platform, Enterprise Edition)」と呼ばれていました。
何百万人ものユーザーが同時にアクセスするような堅牢でスケーラブルなWebシステムの構築は、Java SEが提供する基本的な機能(ファイルI/O、ネットワーク、コレクションなど)だけでは困難です。たとえば、HTTPリクエストを受け付け、動的にWebページを生成するWebサーバーの機能、オブジェクトとDBテーブルのマッピングといったデータベースとの効率的な連携、複数の処理をまとめて成功/失敗させるトランザクション管理の仕組み、ユーザー認証・認可などのセキュリティ対応、システム間で非同期にデータをやり取りするメッセージングの仕組みは、Jakarta EEでなければ実現できません。Jakarta EEはこうしたエンタープライズ開発特有の要求に応えられるAPIの仕様を数多く定義し、標準化して提供しています。
Jakarta EEの主要な仕様(API)例
| Jakarta Servlet |
Webサーバー上でHTTPリクエストを処理し、 レスポンスを生成するための基本仕様 |
| Jakarta Server Pages(JSP) |
HTML内にJavaコードを埋め込み、 動的なWebページを生成するための仕様 (現在はThymeleafなど、ほかのテンプレートエンジンも人気) |
|
Jakarta RESTful Web Services (JAX-RS) |
REST APIを簡単に構築するための仕様 |
|
Jakarta Persistence (JPA) |
Javaオブジェクトをリレーショナルデータベースの テーブルにマッピング(ORM)するための仕様 |
|
Jakarta Contexts and Dependency Injection (CDI) |
コンポーネント間の依存関係を自動的に 管理(DI)するための仕様 |
|
Jakarta Enterprise Beans (EJB) |
分散コンポーネントやトランザクション管理のための仕様。 かつては中核技術でしたが、今はEJBの機能が より細分化されたコンポーネントを組み合わせて 使うのが主流となっています |
Jakarta EE自体は「仕様(ルールブック)」であり、具体的な「製品(ソフトウェア)」ではありません。開発者はJava SEのJDKでコードを書き、Jakarta EEのAPI(JARファイルとして提供される)を利用してWebアプリケーションを構築します。完成したアプリケーションは、Eclipse GlassFish、WildFly、Open Libertyなどといったアプリケーションサーバー上で動作されます。これを「デプロイ」と呼びます。
なぜJava EEはJakarta EEに名前を変更したのか?
Jakarta EEは、かつてJava EEと呼ばれていました。Java EE時代はOracle社が管理をしていましたが、開発の停滞が指摘されており、2017年に同社はオープンソースコミュニティであるEclipse Foundationへの移管を決定したのです。これによって、プロジェクト名は「Jakarta EE」と改められました。
この移管にともない、パッケージ名もjavax.*(Java EE 8まで)からjakarta.*(Jakarta EE 9以降)へと変更されました。既存のJava EEアプリケーションは、Jakarta EE 9以降に対応させる上でコードの修正が必要になり、技術的にも大きな変更となっています。
なお、現代のJavaによるWeb開発では、Jakarta EEのすべての仕様を直接使うよりも、より軽量で迅速な開発が可能なSpring Framework(特にSpring Boot)が主流となっています。しかし、Spring FrameworkもJakarta EEの仕様を土台にしているため、Jakarta EEの概念理解はエンタープライズJava開発者にとって未だに重要です。
JavaFXとは
JavaFXは、かつてのJavaに存在した標準のGUIライブラリ「AWT」や「Swing」の後継として生まれた、より現代的で高機能なGUIを持つJavaライブラリおよびプラットフォームです。モダンでリッチなデスクトップアプリケーション、およびリッチクライアントアプリケーションを開発・実行するために活用します。
JavaFXの主な特徴は、次の通りです。
|
リッチな UIコンポーネント |
標準的なボタンやテキストフィールドだけでなく、 チャート(グラフ)、テーブルビュー、ツリービュー、 メディア(音声・動画)再生など、リッチなUIを 構築するためのコンポーネントが豊富に用意されています。 |
| CSSによるスタイリング |
色、フォント、レイアウトなどといった UIコンポーネントの見た目を、CSSを使って 柔軟にカスタマイズできます。 |
| FXML |
UIのレイアウト構造をHTMLに似たXMLベースの マークアップ言語「FXML」で記述できます。 これにより、UIのデザイン(見た目)と、 アプリケーションのロジック(動作)を分離して 開発しやすくなります。 |
| 3Dグラフィックス |
2Dだけでなく、基本的な3Dグラフィックス機能も サポートしています。 |
| WebView |
アプリケーション内にWebブラウザのコンポーネントである WebViewを埋め込むことで、HTML5やJavaScriptで作られた Webコンテンツの表示・連携ができます。 |
JavaFXは、かつてJava SEの一部としてJDKに同梱されていました。しかしJava 11以降、Java本体のリリースサイクルを迅速化させるために分離され、独立したオープンソースプロジェクト「OpenJFX」として開発が継続されるようになったのです。
そのため、Java 11以降のJDKを使ってJavaFXアプリケーションを開発・実行する場合は、別途OpenJFXのライブラリ(SDK)をダウンロードし、プロジェクトに追加する必要があります。OpenJFXに基づいたSDKやサポートは、Gluonなどの企業が提供しています。
Java関連用語を「提供元(ディストリビューション)による違い」から解説
Java関連用語の中には、OpenJDKとOracle JDKといったように、一見すると類似する文字列のものが存在します。ここからはそれぞれの違いや特徴を説明していきます。
OpenJDKとは
OpenJDKは「Open Java Development Kit」の略で、Java SEの公式な参照実装(リファレンス実装)です。オープンソース・ソフトウェア(GPL v2 with Classpath Exceptionライセンス)として開発・公開されています。誰でも自由に利用、改変、再配布が可能です。Java SEの仕様を満たすJDKの設計図そのものと覚えるとわかりやすいでしょう。
OpenJDKのプロジェクトは現在、提供元であるOracle社が主導していますが、Red Hat、IBM、Google、Amazon、MicrosoftといったIT企業や世界中のコミュニティ開発者もJavaの新機能開発やバグ修正、メンテナンスに参加しています。こうしたJavaエコシステムの中核に存在し、現存する主要JDKディストリビューションのほとんどがベースとしているソースコードを持つのが、OpenJDKというわけです。
Java SEの新たな仕様(JSR:Java Specification Requests)が策定されると、仕様を正しく満たしているかどうか検証するためのTCK(Technology Compatibility Kit:技術互換キット)として、まずOpenJDKが機能します。OpenJDKが存在することで、特定のベンダーによるロックインを防ぎ、Javaプラットフォームの透明性と継続性が保たれていると言っても過言ではありません。
また、様々なベンダーがOpenJDKをベースに独自の最適化や長期サポート、セキュリティパッチの提供などを行うことで、良い意味で競争化が進み、開発者はニーズに合ったJDKディストリビューションを選択できるようになっています。次に説明するOracle JDKもその一つです。初心者の方は「各社のJDKは基本的にOpenJDKを素地にしたものである」と念頭に置いておくと、混乱せずに済むはずです。
Oracle JDKとは
Oracle JDKは、その名の通りOracle社が公式に提供するJDKディストリビューションです。Java 8以前のOracle JDK(当時はSun JDKとして提供)は、Java Flight RecorderやMission Controlといった高度な監視・プロファイリングツールや、フォントレンダリングエンジンのようなクローズドソースのコンポーネントなど、OpenJDKには含まれていない商用機能・サポートが含まれており、OpenJDKとは明確な差がありました。しかしJava 9以降、特にJava 11からこの状況は大きく変わっています。
1. OpenJDKとの機能同一化
Oracleは、2018年のJava 11リリース時に、これまで商用機能としていたJava Flight RecorderなどをOpenJDKに寄贈しました。このオープンソース化により、Java 11以降のOracleがビルドしたOpenJDKのバイナリとOracle JDKは、機能的にはほぼ同じものとなっています。
2. ライセンス体系の変更
最も大きな変更点がライセンスです。
| Java 11〜16 |
Oracleは、Oracle JDKのライセンスを「OTN (Oracle Technology Network)ライセンス」に変更しました。 これにより、個人利用や開発・テスト目的では 無料で使用できるものの、本番環境での商用利用は 原則として有償サブスクリプションが必要となりました。 この変更は「Javaの有償化」として大きな話題となり、 Oracle JDKから他のOpenJDKディストリビューションへ 移行した企業も生まれました。 |
|
Java 17以降 (LTS) |
OTNライセンスへの変更によるユーザー離れを受け、 Oracleは再びライセンス変更を行いました。 Java 17以降のOracle JDKは、本番環境での商用利用を含め、 すべて無料で使用できる「NFTC(No-Fee Terms and Conditions)」 ライセンスとして提供されています。 |
この変更により、商用でも最新LTSバージョンのOracle JDKを無料で利用できるようになりましたが、サポート期間に限りがある点に注意が必要です。セキュリティ修正などのパッチを受け取れるのは、該当するバージョンのサポート期間(次のLTSが出るまでの約3年間)に限られています。サポートを受け続けられる状態にするには、サポート期間が切れるたびに次のLTSバージョンへアップデートするか、有償のJava SEサブスクリプションを活用する必要があります。
Java関連のバージョンアップ・最新動向まとめ
Javaは活発に進化を続けるプログラミング言語のため、基礎知識を学んだ後に知識のアップデートを図ることも欠かせません。これから学ぶのであれば、バージョンアップの経緯を把握しつつ、最新の動向をキャッチアップしていくのが良いでしょう。ここからは、主要なコンポーネントやエディションがどのように進化してきたかを3つのフェーズに分けて解説します。
1. 初期〜成長期(1995年〜2014年頃):機能追加と基盤確立
Javaの歴史は、前述の通り1995年にサン・マイクロシステムズが開発した「Oak(オーク)」というプロジェクトから始まりました。まずは、数年おきに大型アップデートがあった初期の歴史を振り返ってみましょう。
| 1995年 | Java 1.0 登場 | 「Write Once, Run Anywhere(一度書けば、どこでも実行できる)」を掲げ、Webブラウザで動くアプレットなどで注目を集める。 |
| 1998年 | Java 2(JDK 1.2)登場 |
「Java 2」というブランド名で、言語として大きく成長。 ここで「Java SE」「Java EE」「Java ME」といった エディションの概念が生まれ、現在のJavaの基盤が 確立された。 |
| 2000年代 |
J2SE 1.3, 1.4, J2SE 5.0(Java SE 5)と進化 |
特に「Java SE 5」は、ジェネリクス、アノテーション、 拡張forループなど、現代のJavaでは当たり前の 多くの便利機能が追加され、開発効率が 飛躍的に向上した。 |
| 2006年 |
Java SE 6 (コード名: Mustang) 登場 |
安定性とパフォーマンスの向上に重点が置かれ、 堅牢なエンタープライズシステムの開発を支えた。 |
2. 成熟期(2010年〜2018年頃):所有者の変化とJava 8の登場
この時代のポイントは、Java 8の登場です。これはJavaの歴史において大きな転換点で、よりモダンなプログラミングスタイルへと移行するきっかけとなりました。
| 2010年 |
Oracleによる Sun Microsystems買収 |
Javaの開発元がSun Microsystemsから Oracle(オラクル)社へと移管され、 JavaはOracleがリードするプロジェクトに。 |
| 2011年 |
Java SE 7 (コード名:Dolphin)登場 |
並行処理の強化やSwitch文の改善など、 細かいながらも便利な機能が追加。 |
| 2014年 |
Java SE 8 (コード名: Glimmer)登場 |
|
3. モダン化によるさらなる進化期(2018年〜現在):リリースサイクルの迅速化とLTSバージョンの導入
| 2017年 |
Java SE 9 (コード名: Kestrel)登場 |
リリースは当初の予定より遅れたものの、 モジュールシステム(Jigsawプロジェクト)が導入され、 大規模アプリケーションの構造化が容易に。 |
| 2018年〜 |
半年ごとの 新バージョン リリース サイクルへの 移行 |
Java 9の遅延を教訓に、Oracleは 「半年に一度、新バージョンをリリースする」という 迅速なリリースサイクルへの変更を決定。 短い間隔で新しいバージョンが登場するようになった。 レコードクラス、シールクラスなど、言語として 継続的に有効な機能が追加されている。 |
Javaは、Java 9のリリース難航をきっかけに、大きくリリースモデルを変えることになりました。半年に一度というリリースサイクルに企業が対応するのは困難なことも想定し、数年おきに「LTS(長期サポート)バージョン」を設定。Java 8、Java 11、Java 17、Java 21といったLTSバージョンは、企業や安定性が求められるシステムで長期的に使われることを想定した手厚いサポートが提供されています。「非LTSバージョン」で素早く新機能を追加しながら、LTSバージョンで長期的な安定性を保証する。この両輪を回しながら、Javaは現在も進化し続けています。
Javaについてさらに実践的な知識を得るならCodeZineを見てみよう
本記事から、Javaエコシステムの全体像が少しクリアになったのではないでしょうか。CodeZineでは、ITエンジニアやデベロッパーの皆様に向けて、Javaを含む各種プログラミング言語に関する情報を日々お届けしています。現場で働く皆様の情報収集やスキルアップ、交流の場としてイベント「Developers Summit(デブサミ)」「Developers Boost(デブスト)」も定期的に開催しておりますので、興味のある方はぜひチェックしてみてください。
