Javaクラスライブラリ

JavaクラスライブラリはJavaアプリケーションが実行時に呼び出せる動的ロード可能なライブラリ群である。また、特にJREが提供している package=java.lang 名前空間他の基本的なクラスを含むライブラリを指すこともある。このライブラリがそれぞれのオペレーティングシステム  あるいはプロセッサ  の固有機能やシステムライブラリなどを隠蔽して抽象化・標準化する吸収層として働くことで、JavaアプリケーションなどがOSなどのプラットフォームに直接依存することを避けられるようになっている。

JCLはJavaプラットフォーム内で次の3つの役割を担っている。

他の標準ライブラリと同様、コンテナクラス群や正規表現処理といったよく知られている便利な機能群をプログラマに提供する。
ネットワークアクセスやファイルアクセスといったハードウェアやOSに強く依存するタスクへの抽象インタフェースを提供する。
中には、Javaアプリケーションが期待している機能を完備していないプラットフォームも存在する。その場合、欠けている機能をこのライブラリでエミュレートしたり、特定機能の有無をチェックする一貫した方法を提供したりする。

1. 実装と設定
--------

JCLはほぼ全体がJavaで書かれているが、ハードウェアやOSに直接アクセスする必要のある部分はその限りではない。そのようなアクセスを行うクラスでは、一般にOSのAPIへのラッパーとして Java Native Interface を使用している。

JCLのほぼ全体が単一のJavaアーカイブファイル "rt.jar" に格納されており、JREやJDKの一部として配布されている。Javaクラスライブラリ  はデフォルトのブートストラップクラスパスに置かれ、アプリケーションが一々クラスパスを指定する必要はない。ランタイムではJCLを探すのにブートストラップクラスローダを使う。

2. 適合
-----

任意のJava実装は Java Technology Compatibility Kit のコンプライアンステストに合格する必要があり、そこにJCLについてのテストも含まれている。

3. 主な機能
-------

JCLの機能には、パッケージでカプセル化されたクラス群を通してアクセスする。

package=java.lang は、言語とランタイムシステムに密接に関連した基本的なクラスおよびインタフェース群を含む。
ファイルシステムやネットワークにアクセスする機能は package=java.io、package=java.nio、package=java.net というパッケージを通して提供する。ネットワークでもSCTPに関しては package=com.sun.nio.sctp が提供する。
package=java.math は任意精度の整数および小数の演算を提供する。
コレクションとユーティリティ - 組み込みのコレクションデータ構造とユーティリティクラス。正規表現、並行計算、ロギング、データ圧縮などを扱う。
GUIと2Dグラフィックス - AWTパッケージ  はネイティブOSに依存したGUIと2DグラフィックスAPIを提供している。Swingパッケージ  はAWTをベースとしてOS非依存のウィジェット・ツールキットとルック・アンド・フィールを提供する。また、編集可能および編集不可能なテキストコンポーネントも用意している。
サウンド: サウンドデータの読み書き、再生や合成のためのクラスおよびインタフェース群。
テキスト: package=java.text はテキスト、日付、数値、メッセージを扱う。
イメージパッケージ: package=java.awt.image と package=javax.imageio はイメージの読み書きや修正のためのAPIを提供する。
XML: SAX、DOM、StAX、XSLT transforms、XPathなどのAPIにより、SOAPやJava API for XML Web ServicesといったWebサービスを可能にする。
CORBAおよびRMI API
セキュリティ機能を提供する package=java.security と暗号サービスを提供する
データベース: package=java.sql がSQLデータベースへのアクセスを提供する。
スクリプトエンジンへのアクセス: package=javax.script パッケージにより、任意の対応するスクリプト言語へのアクセスを提供する。
アプレット: package=java.applet によりアプリケーションをネットワーク経由でダウンロードして保護されたサンドボックス内で動作可能とする。
JavaBeans: package=java.beans により、再利用可能なコンポーネント群を操作する手段を提供する。
イントロスペクションとリフレクション: name=java.lang.Class がクラスを表すが、java/lang/reflect や java/lang/reflect といった他のクラスは package=java.lang.reflect にある。

4. ライセンス
--------

4.1. かつてのライセンス
--------------

OpenJDKがリリースされる以前、JDKは基本的にプロプライエタリなライセンスだった。2006年、サン・マイクロシステムズはJavaをオープンソースにする意思があると発表。2007年前半にJDKのほぼ全部をオープンソースとしてリリースすると約束した。2007年5月8日、サンがオープンソース化する権利を有していない一部を除いたクラスライブラリのソースコードをGPLライセンスで公開した。その後は、公開できなかった部分をオープンソース化することが目標となった。

オープンソース化できなかった部分は使わないとしても依存関係があるためにビルドには必須であり、「バイナリプラグ」と呼ばれた。サンはコミュニティの協力も得て、バイナリプラグをオープンソース化したりオープンソースの代替品で置換していった。2008年5月にリリースされた OpenJDK 6 ではオープンソース化できていない部分は1%となっていた。

2007年5月時点でオープンソース化できていなかった部分は次の通りである。

SNMP実装
オーディオエンジン全体。シンセサイザー部分も含め、後にオープンソースとなった。シンセサイザー部分はOpenJDKプロジェクトで //Gervill// と呼ばれるオープンソース版を新規開発した。
暗号関連クラス群は後にオープンソースとしてリリースされた。
フォントラスタライズと拡大縮小のコードは、オープンソースのFreeTypeで置換。
カラーマネージメントシステムは、オープンソースのLittleCMSで置換。プラグイン可能なレイヤーがあるので、商用には本来のプロプライエタリなカラーマネジメントシステムを使うこともできる。
アンチエイリアス機能のあるグラフィックスラスタライザは、phoneMEプロジェクトで使っていたオープンソースのPiscesを採用。
JavaScriptプラグインはオープンソース化された。

4.2. オープンソースライセンス
-----------------

2010年12月、「バイナリプラグ」と呼ばれていた部分は全てオープンソースの代替品で置換され、JDK全体がオープン化された。

5. 代替実装
-------

Javaクラスライブラリの他のフリーソフトウェア実装としては、GNU Classpath がある。他の実装とは異なり、これはクラスライブラリのみを実装しており、多くのフリーなJava実装、Kaffe、SableVM、JamVM、CACAO などで使われている。

Apache Harmony もクラスライブラリのフリーソフトウェア実装だった。これにはJava仮想マシンとJavaコンパイラなども含まれており、Javaスタック全体をフリーソフトウェアで実装することを目的としていた。

6. 脚注
-----

7. 関連項目
-------

Java Platform, Standard Edition
OpenJDK
標準ライブラリ
Javaアプレット

8. 外部リンク
--------

[1]
[2]