Java

**Java**（ジャバ、ジャヴァ）は、汎用プログラミング言語とソフトウェアプラットフォームの双方を指している総称ブランドである。オラクルおよびその関連会社の登録商標である。1996年にサン・マイクロシステムズによって市場リリースされ、2010年に同社がオラクルに吸収合併された事によりJavaの諸権利もそちらに移行した。

プログラミング言語Javaは、C++に類似の構文、クラスベースのオブジェクト指向、マルチスレッド、ガベージコレクション、コンポーネントベース、分散コンピューティングといった特徴を持ち、平易性重視のプログラム書式による堅牢性と、仮想マシン上での実行によるセキュリティ性およびプラットフォーム非依存性が理念とされている。Javaプラットフォームは、Javaプログラムの実行環境または、実行環境と開発環境の双方を統合したソフトウェアであり、ビジネスサーバ、モバイル機器、組み込みシステム、スマートカードといった様々なハードウェア環境に対応したソフトウェア形態で提供されている。その中枢技術であるJava仮想マシンは各プラットフォーム環境間の違いを吸収しながら、Javaプログラムの適切な共通動作を実現する機能を備えている。このテクノロジは「*[[write once, run anywhere]]*」と標榜されていた。

2019年の時点でGitHubによると、Javaは特にクライアント/サーバモデルのWebアプリケーションで使用されている最も人気の高いプログラミング言語の1つであり、全世界でおよそ900万人の開発者がいるとレポートされている。

最新バージョンは、2025年9月にリリースされたJava 25である。

Java実行環境（JRE）をオラクルはJava 11で廃止して、アプリ開発者にはOpenJDKのサブセットを同梱配布することを推奨していて、開発者以外はJava開発キット（JDK）をインストールしないことを薦めている。そのため、特殊な事情でJava 8のJREがインストールされていることが必要でない限り、オラクルはセキュリティ問題によるリスクを回避するために、旧バージョンのアンインストールを強く推奨している。

## Javaの特徴
現在の正規ベンダーであるオラクルの公式アピールは、以下の通りである。特に業務用システムの構築に最適であるとしている。
オラクルによると、全世界の3億のコンピュータデバイスでJava実行環境が動作しており、全世界の200万の人員がJava開発環境を使用しており、全世界で250億枚のJava Cardが発行されている、と統計されている。

### Javaの構文
Javaプログラム構文は、C++によく似たものである。オブジェクト指向言語の一面が強調されがちだが、C言語のような手続き型言語としてもプログラミングできる。Javaはオブジェクト指向パラダイムをそれほど強制しない。

Javaは、同時にマルチパラダイム言語でもある。JDK 1.1でJavaBeans/JavaRMI/CORBAによるコンポーネントプログラミングと、リフレクションAPIによるメタプログラミングが備えられた。J2SE 5.0でジェネリクス構文/APIによるジェネリックプログラミングが追加された。Java SE 7で並行APIによる並行プログラミングが追加された。Java SE 8ではラムダ式/関数型インターフェース/ストリームAPIなどによる関数型プログラミングが追加された。2014年（Java 8）以降の関数型とジェネリクスを多用しているJavaプログラムは、それ以前のJavaプログラムから大きく様変わりしている。

### オブジェクト指向
Javaは、クラスベースのオブジェクト指向である。クラス、インターフェース、インスタンスといった概念を中心にしたものである。クラスのメンバ要素は、フィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラス、コンストラクタ、ファイナライザである。インターフェースは抽象メソッドと定数で構成される純粋抽象クラスである。クラスはインスタンスのひな型であり、インスタンスはクラスを実体化したものである。Javaプログラムは、1個以上のクラス定義文から形成される。Javaのクラスはカプセル化、継承、多態性をサポートしている。

カプセル化は、クラスメンバの可視性 (private, package, protected, public) でサポートされている。可視性とはメンバのアクセス許可範囲を定めるものであり、`private`は同クラス内限定、`package`は同クラス内と同パッケージ内限定、`protected`は同クラス内と同パッケージ内と派生クラス内限定、`public`は制限なしを意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性は、ファイル単位の`package`なので隠蔽性よりも利便性が重視されている。

継承は、スーパークラスが一つに限られる単一継承をサポートしている。多重継承は不可である。既存クラスに任意メンバを追加した新規クラスを作成できる。Javaの全クラスは`Object`クラスをルートクラスとしてデフォルト継承する。`Object`クラスにはロック機能が備えられており、これは並行プログラミングを前提にした仕様である。

多態性は、仮想関数、抽象クラス、インターフェース、動的ダウンキャストでサポートされている。スーパークラスの`virtual`メソッドを、サブクラスの同名メソッドでオーバーライドできる機能を仮想関数と言う。スーパークラス変数にサブクラスインスタンスを代入してその変数からサブクラスのメソッドが呼ばれるようにするのは、サブタイピングになる。インターフェースは抽象メソッドだけの純粋抽象クラスであり、任意の数だけクラスに実装できる。実行時ダウンキャストは`instanceof`演算子の実行時型チェックが可能で、ダウンキャスト失敗時は例外発生する。

### プラットフォーム非依存
プラットフォーム非依存とは、Javaプログラムが特定のハードウェアやオペレーティングシステムに依存せずに、あらゆる環境での共通動作を保証する概念である。”*Write once, run anywhere*”（一度プログラムを書いてしまえば、どのコンピューターでも動くよ）とされる。Javaのプラットフォーム非依存性は次のようにして実現されている。

#Javaコンパイラは、Javaソースコードを、Javaバイトコードという中間表現にコンパイルする。Javaバイトコードは、Java仮想マシン用の実行コードである。Javaバイトコードは通常、Javaクラスファイルにまとめられる。
#Java仮想マシンは、各プラットフォームの差異を吸収するクッション的なソフトウェアである。Java仮想マシンは、様々なコンピュータ環境対応バージョンが提供されており、各プラットフォームにJava実行環境の中核としてインストールされる。
#Java仮想マシンは、任意のJavaクラスファイルをJavaクラスローダーで読み込み、そのJavaバイトコードを解釈実行する。インタプリタ式の解釈走行と、実行時コンパイラで解釈走行させるものがある。

Java初期のインタプリタ式で走行されるJavaプログラムの実行速度は遅かったが、実行時コンパイラ技術と動的再コンパイル技術 (dynamic recompilation) の導入によって実行速度問題はほぼ解決した。実行時コンパイラとは、一定のJavaバイトコードをまとめてネイティブコードにコンパイルして継続的に実行させる技術である。Java仮想マシンはメモリ境界とバッファオーバーフローのチェックを行いながらプログラムを走行させる。また、クラスロード時のバイトコード検証機能によって、あからさまなコード暴走や致命的エラーの頻発を事前抑止している。

### マルチスレッド
Javaプログラムは、複数以上のスレッドを同時走行できる。これをマルチスレッドと言う。多数のスレッドを扱う大規模システムにも対応しており、例えばスレッドグループAPIは、スレッドたちを役割や性質でグループ化して一括操作できる。これはクライアント・サーバシステムの実装向けである。また、多数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成/破棄の反復による負荷増大を回避するための、スレッドプールとタスクキューを合わせたスレッドモニタAPIも用意されている。

Javaのマルチスレッド並行計算は、クリティカルセクション同期が基準にされている。Javaの全インスタンスは、ロック機能を備えている`Object`クラスをルート継承しているので、クリティカルセクションのロックオブジェクトにできる。Javaでは`synchronized`で指定された範囲がクリティカルセクションになる。Javaの標準ロック手法は、ミューテックスのモニタである。`synchronized`メソッドはその全体が排他セクションになり、そこではThisインスタンスがロックオブジェクトになる。`synchronized`静的メソッドでは、システム内の専用インスタンスがロックオブジェクトになる。また、`synchronized(指名変数)`構文でメソッド内の任意範囲をクリティカルセクションにして、そこでは指名変数がロックオブジェクトになる。

ミューテックスのモニタ以外の、カウントセマフォやバリアや読み書きロックなどのロック手法は、並行APIの方で用意されている。

### ガベージコレクション

Javaプログラムのメモリ管理は、Java仮想マシンのガベージコレクションによって行われる。ガベージコレクションとは、すでにどこからも参照されていないインスタンスを自動的に特定して破棄し、その占有メモリ領域を自動的に解放する機能である。人の手によるオブジェクトの生成と破棄を正確に対応させるメモリ管理作業は煩雑化するのが常であり、メモリリークや不正リリースによるエラーを引き起こしやすく、バグの温床と化すのが通例であった。それらを自動化したガベージコレクションは、Javaプログラマを複雑なメモリ管理作業から解放する。

ガベージコレクタのプロセスは、システムスレッドに乗って未参照のインスタンスを探し続ける。どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する。Javaではガベージコレクション機能に並々ならぬ力が入れられており、その技術更新は現在も進行中である。世代別ガベージコレクタ、応答時間短縮化のレイテンシ重視ガーベジコレクタ、休止時間短縮化のスループット重視ガーベジコレクタなどが導入されて更に改訂を重ねており、運用環境別の選択使用も可能にされている。

### 分散コンピューティング

Javaの分散コンピューティングプログラミングは、オブジェクト要求ブローカーに準拠している。これはネットワーク上に存在する様々なプラットフォームの間で、互いに異なる環境を意識せずにリクエストとレスポンスを送りあい任意のタスクを遂行する分散システムの構築をサポートする。各プラットフォーム上で稼働されるサーバアプリケーションとクライアントアプリケーションは、それぞれオブジェクトを内包しており、業界共通規格のCORBAまたはJava独自規格のRMIが提供する運用アーキテクチャと通信プロトコルを通して、他のオブジェクトと相互にコミュニケーションする。それらは分散オブジェクトと呼ばれている。

業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるようにRMI over IIOPなどの様々な技術が実装されている。CORBAの通信プロトコルはIIOP、RMIの方はJRMPである。分散オブジェクトを実装するためのAPIとクラスライブラリの多くはJakarta EEに属している。分散オブジェクトの中でサーバ機能に特化されたものはEJB (Enterprise JavaBeans) と呼ばれている。

EJBは、クライアントと同期通信を行いトランザクションを管理するセッションビーン、データベースとリンクして永続データを管理するエンティティビーン、様々なイベントからの非同期通信を管理するメッセージドリブンビーンの三種に大別される。これらのEJBは、EJBコンテナに内包されて運用される。分散オブジェクト同士が通信するためのプロトコルは、IIOPかJRMPが使われる。JNDIは、照会された識別名からネットワーク上の分散オブジェクトや各種リソースのロケーションを特定して通信ないしアクセスできるようにする。

EJBコンテナは、WEBコンテナと連携して運用されるのが普通である。EJBコンテナはWEBコンテナを一般的なクライアント窓口として使用することが多い。WEBコンテナはサーブレットとJSP（Java Server Pages）を内包しているWEB用サーバアプリケーションであり、HTTPプロトコルを通して一般的なWEBブラウザとの同期通信を行う。WEB方面の分散オブジェクトは、WEBコンポーネントと呼ばれる。JSPはいわゆるWEBサイトの表示に特化したコンポーネントである。サーブレットはWEBサイトへのリクエストを処理し、場合によってはセッションビーンにトランザクションを委譲するコンポーネントである。EJBコンテナではJBossやWebSphereなどが有名である。EJBコンテナはWEBコンテナと統合されて提供されている事が多い。WEBコンテナではApache Tomcatが有名である。

### セキュリティ

分散ネットワークプログラミングを重視しているJavaは、サンドボックスモデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム（Javaバイトコード）による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散（distributed）指向のJavaプログラムでは、Javaクラスファイルを遠隔ロードする機会が多いので、サンドボックス実行は必須になる。Javaのサンドボックスは、大抵は以下の手順になる。

* クラスローダーは、バイトコードをダウンロードして順次クラス化する。
* 実行環境内のセキュリティポリシーファイルに従って、各種パーミッションが各クラスに付与される。セキュリティポリシーは主に、クラス名とそのパーミッションのペアで記述されている。
* 実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。
* スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。
* その際は、スレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。
* 遠隔ロードされたappletクラスなどのパーミッション皆無のクラスのメソッドを一度でも通ったスレッドは、完全なサンドボックス実行になりほとんどのリソースにアクセスできなくなる。

実際には上記に加えて、各クラスを役割やセキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。

## Javaの歴史

### 誕生の経緯
#### 家電向けプロジェクトの立ち上げ（1990年12月）

Javaの歴史は、1990年12月にサン・マイクロシステムズ（サン）が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するための水面下プロジェクトをリサーチ段階を兼ねて試験的に立ち上げた事から始まる。サンはこの分野が今後の重要市場になると予測していた。サンのエンジニアであるジェームズ・ゴスリンやパトリック・ノートンらの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らはカリフォルニア州メンローパーク市サンドヒルロードに用意された比較的小さなオフィスで開発を始めた。

#### Oak言語とGreen OSの誕生（1991年）

グリーンチーム内では当時の主流であったオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語であるC++に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の組み込みシステムであったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が最重要の家電製品の制御装置には不向きであると判断されたためだった。加えてC++では移植性に対応できない点も指摘され、プラットフォーム非依存も重要な議題として提起された。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。

一方で、Mesa言語とC言語の長所を理想にしていたサンのエンジニアのビル・ジョイは、C++をモデルにした新しいオブジェクト指向言語の開発を提案するワーキングペーパーに*Further*という題名を付けて自社に上申した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を1991年秋に誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語に「Oak」という名前をつけた。これがJavaの前身である。

#### 携帯端末、テレビ機器市場への参入と撤退（1992年 - 1994年5月）

1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとより広範囲な可能性を秘めるようになったグリーンプロジェクトの対象は当初の家電機器から、当時のトレンドであった携帯情報端末 (PDA)へとシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このStar7のユーザーインターフェース上で後のマスコットキャラ「Duke」が初登場している。

1992年11月、サンはファーストパーソンという会社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソンは、ケーブルテレビ用セットトップボックス事業への参入を決めて、タイム・ワーナーと3DOにそれぞれOakテクノロジを提示した。しかし、その余りに高度な柔軟さが却って倦厭されてしまい契約実現には到らなかった。サン本社はファーストパーソンの解散を決め、グリーンチームも本社に戻された。

#### ワールドワイドウェブ参入（1994年6月1994年9月）

1994年6月、サン技術部長ジョン・ゲージがジェームズ・ゴスリン、ビル・ジョイ、パトリック・ノートン、エリック・シュミットら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らはワールドワイドウェブをプロジェクトの本命に据える事で一致した。革新的なウェブブラウザである「NCSA Mosaic」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。

#### Javaの始動（1994年10月～1996年1月）

1994年秋までにグリーンチームは、Oakを「Java」に、WebRunnerを「HotJava」に改称した。Green OSは「Java Runtime Environment」に落とし込まれた。改称の理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたと言われる。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆（Bean）はJavaテクノロジ内でコンポーネントを指す用語にされている。

1994年10月、JavaランタイムとHotJavaブラウザがサンの幹部社員たちの前でデモンストレーションされた。1995年5月にアルファ版が社内公開され、5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここではJavaアプレットの技術がセールスポイントとしてアピールされた。同時にネットスケープが「Netscape Navigator」ブラウザへのJavaアプレット機能導入をアナウンスして業界の注目を集めた。1995年秋にベータ版が社外公開された。1996年1月9日にサンは、正式にJavaソフトウェア部門を立ち上げた。基幹テクノロジは市場リリース段階まで進捗していたが、その他のテクノロジは未だ途上段階であり、プラットフォームと呼べる域までは達しておらず、初回リリースのプロダクト名は、Javaランタイム環境を内包したデヴェロップメントキットになった。1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。

### バージョン履歴

## Javaプログラミング例

### Hello World

```java
// Hello.java
void main() {
    IO.println("Hello, World!");
}
```


Javaプログラムはコンパクトソースファイルの場合は、`main`メソッドから開始する。`IO.println("文字列")`は`IO`クラスの`println`メソッドを呼び出す。

## Javaプラットフォーム

Javaプラットフォーム (*Java Platform*) は、Javaプログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、Java実行環境およびJava開発環境の構成内容と、Javaテクノロジの追加内容を変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなくサードパーティー側からも提供されており、その標準化はJavaコミュニティプロセス (JCP) が管理している。Java実行環境とJava開発環境はオープンソース化されているので各企業、各団体、開発者各自が営利または非営利で様々なソフトウェアと関連技術を公開しており、巨大なITエコシステムを構築している。

### エディション
Java 25現在、Java Platform, Standard EditionとJava Cardが存在する。エディションによってJava実行環境とJava開発キットに含まれるツール構成に違いがあり、またクラスライブラリとAPIの構成内容も異なっている。Java仮想マシンの性能にも差異がある。JDK 1.1までは単体エディションで、J2SE 1.2からJava SE, ME, EEの3エディションに分かれた。J2SE 5.0頃から拡張テクノロジの一つであったJava Cardが昇格して4エディションとなった。Java 9にてEEとMEがなくなりJava SEとCardの2エディションとなった。

; Java Platform, Standard Edition (Java SE)
: モバイル端末からサーバーまでをカバーする汎用のエディション。モバイルアプリ、デスクトップアプリ、Webアプリなどをカバーする。
; Java Card
: スマートカード（ICカード）、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。ではSIMカードやATMカードなど幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。

Java 8までは以下のエディションが存在した。
; Java Platform, Enterprise Edition (Java EE)
: サーバマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバ及び多層クライアントサーバ、業務用システムを開発する為の、様々な拡張技術クラスライブラリ&amp;APIが追加されている。業務用プロフェッショナル仕様であり大規模である。
: 2017年9月にオラクルはJava EEがJava 8で終了し、Java 9以降の開発はJakarta EEとしてエクリプス財団によって行われる事を発表した。Java EEの商標は現行版のサポートを続けるオラクルが保持したので、エクリプス財団による今後のバージョンは**Jakarta EE**の名称で公開される事になった。
; Java Platform, Micro Edition  (Java ME)
: 組み込みシステム、マイクロコントローラ向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&amp;APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。

### Java実行環境 (JRE)

Java実行環境 (*Java Runtime Environment*; JRE) は、Javaアプリケーションを実行するために必要なソフトウェアである。Java仮想マシン、Java.exeのスターターを含めた各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。

#### Javaクラスライブラリ
Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。

# 基礎ライブラリ - Java言語の基礎を扱う。
# 入出力ライブラリ - ファイル入出力など。
# コレクションライブラリ - 動的配列と動的連想配列。データ集合の操作。
# 数学ライブラリ - 各種計算を扱う。
# 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
# ネットワークライブラリ - ソケット通信を扱う。
# GUIライブラリ - グラフィカル・ユーザーインターフェースを扱う。
# アプレットライブラリ - アプレット生成用。
# Javaビーンズライブラリ - ソフトウェアコンポーネント作成用。
# データベース接続ライブラリ - SQLを扱う。
# リモートメソッドライブラリ - 分散オブジェクトを扱う。
#セキュリティライブラリ - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。

#### Javaアプリケーションの形態
Javaクラスライブラリを利用する事でJavaプログラムは以下アプリケーション形態などが存在する。

;Javaアプリケーション (application)
:パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。Java 10までは「Java Web Start」は任意のjnlpファイル（*java network launching protocol*）をダウンロードして実行できるJavaアプリの配布システムがあった。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。

以下はEclipse FoundationのJakarta EEにある。
;Jakarta Servlet
:サーバマシンで実行されるJavaプログラム。その名の通り手軽にサーバプログラムを実装出来るが、大規模サーバの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。PerlなどによるCGIに比べ、サーバ側の負荷が低いなどのメリットがある。
;Jakarta Pages
:サーブレットをWEBサーバ用に特化したものであり、HTML内に記述するJavaプログラムである。WEBクライアントからのリクエストに伴うパラメータに従い、それをサーバ側で解釈してWEBページ内容を動的に生成、変化させてレスポンスする。コードは似ているが、JavaScriptの様にブラウザ側で実行するスクリプトではない。類似の技術にActive Server Pages、PHPがある。

Java 10までは以下の物があった。
;Javaアプレット (applet)
:サーバからダウンロードされてWEBブラウザ上で実行されるJavaプログラム。サンドボックス機能下で厳しい動作制約が加えられている。。
:Java Cardプラットフォームの分野であるスマートカード（ICカード）上で動くJavaプログラムもアプレットと呼ばれており、現在ではこちらに舞台を移している。

### Java開発キット (JDK)

Java開発キット (*Java Development Kit*) は、Javaプログラムを開発するために必要なソフトウェアである。Java実行環境も内包している。Javaコンパイラなどの基本開発ツール、各種開発サポートツール、Java APIで構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。

* J2SE 1.2.2_004 までは、JDK (*Java Development Kit*) と呼んでいた。
* J2SE 1.4 までは、Java2 SDK (*Java2 Software Development Kit*) と呼んでいた。
* J2SE 5.0 からは再び、JDK (*Java Development Kit*) と呼んだ。
* JavaSE 7 からは、エンタープライズ版とマイクロ版では Java SDK (*Java Software Development Kit*) と呼び、スタンダード版とカード版では JDK (*Java Development Kit*)と呼ぶようになった。JDKはSDKの拡張サブセット（SDKの一部分＋その他）とされる。

#### Java API
APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いて各種ソフトウェアの開発を行う。APIは基本的にクラスライブラリの所属に沿って、パッケージ (*package*) と呼ばれる名前空間で分類されて提供されている。パッケージは各ワードをピリオドで連結して階層化されている。先頭ワードのjavaは開発元提供の純正基礎版を意味する。他に純正拡張版のjavax、任意団体提供のorg、企業提供のcomがある。

# java.lang - Java言語の基礎を扱う。
# java.io - ファイル入出力など。
# java.util - 動的配列と動的連想配列。データ集合の操作。
# java.math - 各種計算を扱う。
# java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
# java.net - ソケット通信を扱う。
# java.awt - グラフィカル・ユーザーインターフェイスを扱う。
# java.applet - アプレット生成用。
# java.beans - ソフトウェアコンポーネント作成用。
# java.sql - SQLを扱う。
# java.rmi - 分散オブジェクトを扱う。
# java.security - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。

#### 統合開発環境と開発支援ツール
統合開発環境 (IDE)は、JDKを中核にしてビジュアルエディターやビルドマネジャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業と任意団体から公開されている。

* **[[NetBeans]]** - （サン・マイクロシステムズ→オラクル）オープンソースIDE。NetBeans.org NetBeans.jp。
* '''Eclipse SDK''' - （IBM→Eclipse財団）オープンソースIDE。Java用IDEの共通基盤存在である。ここからWebSphere Studio、JBuilderなど様々なIDEが派生している。eclipse.org EclipseWiki。
* **WebSphere Studio** -（IBM）商用IDE。Eclipseに有料プラグイン機能を組み合わせたもの。現在はアップデート停止。WebSphere。
*  -  (IBM) Rationalブランド商用IDE。WebSphere Studioの後継製品。
* **[[JBuilder]]** - （ボーランド→エンバカデロ・テクノロジーズ）商用IDE。JBuilder2007からEclipseベースになっている。JBuilder。
* '''Oracle JDeveloper''' - （オラクル）Oracle Application Serverと統合されている。2005年6月28日に無料化した。JDeveloper。
* **Oracle Workshop for WebLogic** - （BEAシステムズ→オラクル）と統合されている。Oracle Workshop。
* **[[BlueJ]]** - （サン・マイクロシステムズ、豪ディーキン大学、英ケント大学の共同開発）フリーIDE。BlueJ。
* **[[IntelliJ IDEA]]** - (JetBrains) 商用IDE。Android Studioのベースになった。IntelliJ IDEA。
* **JCreator** - (Xinox Software) 商用IDE。JCreator。
* **[[Xcode]]** - （Apple）macOSに付属するIDE。

開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。

* **[[Apache Ant]]** - Javaアプリケーションのビルドツール。Apacheソフトウェア財団のプロジェクトによって開発された。コンパイル、バージョン管理システムとの連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。make と同種のツールであり、XMLファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
* **[[Apache Maven]]** - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
* **[[Gradle]]** - Apache AntやApache Mavenのコンセプトに基づくオープンソースビルド自動化システム。
* **[[JUnit]]** - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。xUnitの一種である。テスト駆動開発を支援する。

### Javaテクノロジの数々

Javaテクノロジは、個人を含む各種組織から様々な形態で公開されている。開発元から提示された技術は、Java Community Process (JCP) による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化 (*standardization*) と言う。Javaテクノロジが準拠すべき規範仕様は、JCP管理下で発行される数々のJava仕様要求 (Java Specification Request) にて定義されている。Javaテクノロジは様々な分野に導入されている。その一例を以下に列挙する。

; JNI (Java Native Interface) : 他の言語で実装されたネイティブコードを呼び出す技術
; JMI (Java Metadata Interface) : Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
; JML (Java Modeling Language) : 契約による設計 (DbC) を指向した形式言語をソースコードに導入する
; JMX (Java Management Extensions) : 主に分散システムで依存性の注入によるJavaプログラムの動的な再構成技術
; JDMK (Java Dynamic Management Kit) : JMX仕様に基づいた開発支援ソフトウェア
; JDO (Java Data Objects) : オブジェクト永続化の仕様
; Jini : 分散システムを構築するネットワークアーキテクチャ
; JavaSpaces : Jiniの分散システム環境でオブジェクトの送受信と永続化などをサポートするテクノロジ
; JAIN (Java API for Integrated Networks) : 統合通信ネットワーク用のAPI
; JSF (Java Server Faces) : WEBクライアントにユーザーインターフェースを提供するサーバ用テクノロジ
; JXTA : P2Pの仮想ネットワークのためのオープンプロトコル
; OSGi : サービスの動的な管理と遠隔保守
; Java3D : 3次元グラフィクスプログラミングのための高水準なAPI。Java 3D
; JOGL (Java OpenGL) : OpenGLを使う3Dプログラミングのための低水準なAPI
; JAI (Java Advanced Imaging) : 高水準な画像操作API

; LWJGL : ゲーム開発用のAPI。OpenGL, OpenAL, OpenCLを扱える。様々なゲーム用コントローラーも扱える。
; JSML (Java Speech Markup Language) : 音声合成システムにテキスト注釈を追加する

; Blu-ray Disc Java : ブルーレイディスク (BD) で実行される各種コンテンツ制作用

### Javaオープンソースモデル
サン・マイクロシステムズは1996年のリリース当初からJava実行環境とJava開発環境をオープンソース化しており、サードパーティーにJavaテクノロジ開発への参入をアピールしていた。ただしJavaの普及に一定のコントロールをかける為にソースコードの改変までは認めていなかった。2004年になるとIBMが業界の優位性を活かしてJavaオープンソースプロジェクトの主導権を握るようになった。Javaコミュニティプロセスを取り巻く業界の変化を悟ったサン・マイクロシステムズはIBMとの本格的な提携を承認し、2007年にJava SE 6を「OpenJDK」としてGNU一般公開ライセンスの下でリリースした。OpenJDKではソースコードの改変も認められた。GNUプロジェクトは「GNU Interpreter for Java」、GNUコンパイラコレクションの「GNU Compiler for Java」、互換クラスライブラリの「GNU Classpath」を公開した。Windows用GNU Compilerは、MinGWと併せてCygwinの環境上でも実行できた。

WindowsやLinuxなどのメジャーOSでは、オラクル、IBM、Blackdown、GNUプロジェクト、Kaffe.orgなどによるJavaプラットフォームが公開されている。また、JavaソースコードをそのままWin用実行ファイルに変換する「Excelsior JET」や、JarファイルをWin用実行ファイルに変換する「exewrap」「Launch4j」「NSIS」「JSmooth」なども販売ないし公開されている。

## Java認定資格

オラクルは複数のJava認定資格を主催している。Javaのバージョンアップに伴って資格も変更されることがある。ただし、変更前に取得した資格は変更後も有効である。認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。

## 注釈

## 出典

## 参考文献
* Jon Byous, ''Java technology: The early years''. Sun Developer Network, 日付不明（1998年頃）.（2005年4月22日に参照）
* James Gosling, ''A brief history of the Green project''. Java.net, 日付不明（1998年第1四半期頃）.（2005年4月22日に参照）
* James Gosling, Bill Joy, Guy Steele, and Gilad Bracha, *The Java language specification*, third edition. Addison-Wesley, 2005. ISBN 0-321-24678-0.
** 村上雅章（訳） 『Java言語仕様 第3版』 ピアソン・エデュケーション、2006年、ISBN 4-89471-715-8
* Tim Lindholm and Frank Yellin. *The Java Virtual Machine specification*, second edition. Addison-Wesley, 1999. ISBN 0-201-43294-3.
** 村上雅章（訳） 『Java 仮想マシン仕様 第2版』 ピアソン・エデュケーション、2001年、ISBN 4-89471-356-X
* ジョシュア・ブロック（著）、柴田芳樹（訳） 『Effective Java プログラミング言語ガイド』 ピアソン・エデュケーション、2001年、ISBN 4-89471-436-1

## 関連項目

* Javaの文法
* Javaのキーワード (予約語)
* Javaの性能
* Javaに対する批判
* C♯とJavaの比較
* Java仮想マシン
* Javaコンパイラ
* Java Community Process - Java技術の標準化プロセス
* Javaチャンピオン

## 外部リンク
### オラクル・JCP関連
* Java  - Javaのユーザー向け公式サイト
* Javaソフトウェア | オラクル | Oracle 日本 - オラクル
* Java Community Process  - JCPのサイト。JSRなどを閲覧できる
** Java Downloads
** Java Platform Standard Edition 7 ドキュメント
** Java SE APIおよびドキュメント
** Java チュートリアル

### 技術情報
* @IT: Java Agile  - Java技術者のための情報提供/情報交換フォーラム
* IBM developerWorks Java technology  - IBM developerWorks の開発者向けの記事
* OpenJDK