Javaクラスライブラリ

Javaクラスライブラリ（ジャバクラスライブラリ、JCL）はJavaアプリケーションが実行時に呼び出せる動的ロード可能なライブラリ群である。また、特にJREが提供している java.lang 名前空間他の基本的なクラスを含むライブラリを指すこともある。このライブラリがそれぞれのオペレーティングシステム (OS) あるいはプロセッサ (CPU) の固有機能やシステムライブラリなどを隠蔽して抽象化・標準化する吸収層として働くことで、JavaアプリケーションなどがOSなどのプラットフォームに直接依存することを避けられるようになっている。 JCLはJavaプラットフォーム内で次の3つの役割を担っている。 他の標準ライブラリと同様、コンテナクラス群や正規表現処理といったよく知られている便利な機能群をプログラマに提供する。 ネットワークアクセスやファイルアクセスといったハードウェアやOSに強く依存するタスクへの抽象インタフェースを提供する。 中には、Javaアプリケーションが期待している機能を完備していないプラットフォームも存在する。その場合、欠けている機能をこのライブラリでエミュレートしたり、特定機能の有無をチェックする一貫した方法を提供したりする。 JCLはほぼ全体がJavaで書かれているが、ハードウェアやOSに直接アクセスする必要のある部分はその限りではない（例えば、入出力、ビットマップグラフィックス）。そのようなアクセスを行うクラスでは、一般にOSのAPIへのラッパーとして Java Native Interface を使用している。 JCLのほぼ全体が単一のJavaアーカイブファイル "rt.jar" に格納されており、JREやJDKの一部として配布されている。Javaクラスライブラリ (rt.jar) はデフォルトのブートストラップクラスパスに置かれ、アプリケーションが一々クラスパスを指定する必要はない。ランタイムではJCLを探すのにブートストラップクラスローダを使う。 任意のJava実装は Java Technology Compatibility Kit のコンプライアンステストに合格する必要があり、そこにJCLについてのテストも含まれている。 JCLの機能には、パッケージでカプセル化されたクラス群を通してアクセスする。 java.lang は、言語とランタイムシステムに密接に関連した基本的なクラスおよびインタフェース群を含む。 ファイルシステムやネットワークにアクセスする機能は java.io、java.nio、java.net というパッケージを通して提供する。ネットワークでもSCTPに関しては com.sun.nio.sctp が提供する。 java.math は任意精度の整数および小数の演算を提供する。 コレクションとユーティリティ - 組み込みのコレクションデータ構造とユーティリティクラス。正規表現、並行計算、ロギング、データ圧縮などを扱う。 GUIと2Dグラフィックス - AWTパッケージ (java.awt) はネイティブOSに依存したGUIと2DグラフィックスAPIを提供している。Swingパッケージ (javax.swing) はAWTをベースとしてOS非依存のウィジェット・ツールキットとルック・アンド・フィールを提供する。また、編集可能および編集不可能なテキストコンポーネントも用意している。 サウンド: サウンドデータの読み書き、再生や合成のためのクラスおよびインタフェース群。 テキスト: java.text はテキスト、日付、数値、メッセージを扱う。 イメージパッケージ: java.awt.image と javax.imageio はイメージの読み書きや修正のためのAPIを提供する。 XML: SAX、DOM、StAX、XSLT transforms、XPathなどのAPIにより、SOAPやJAX-WS（英語版）といったWebサービスを可能にする。 CORBAおよびRMI API（組み込みのORBを含む） セキュリティ機能を提供する java.security と暗号サービスを提供する javax.crypto データベース: java.sql がSQLデータベースへのアクセスを提供する。 スクリプトエンジンへのアクセス: javax.script パッケージにより、任意の対応するスクリプト言語へのアクセスを提供する。 アプレット: java.applet によりアプリケーションをネットワーク経由でダウンロードして保護されたサンドボックス内で動作可能とする。 JavaBeans: java.beans により、再利用可能なコンポーネント群を操作する手段を提供する。 イントロスペクションとリフレクション: java.lang.Class がクラスを表すが、Method や Constructor といった他のクラスは java.lang.reflect にある。 OpenJDKがリリースされる以前、JDKは基本的にプロプライエタリなライセンスだった。2006年、サン・マイクロシステムズはJavaをオープンソースにする意思があると発表。2007年前半にJDKのほぼ全部をオープンソースとしてリリースすると約束した。2007年5月8日、サンがオープンソース化する権利を有していない一部を除いたクラスライブラリのソースコードをGPLライセンスで公開した。その後は、公開できなかった部分をオープンソース化することが目標となった。 オープンソース化できなかった部分は使わないとしても依存関係があるためにビルドには必須であり、「バイナリプラグ」と呼ばれた。サン（と後にオラクル）はコミュニティの協力も得て、バイナリプラグをオープンソース化したりオープンソースの代替品で置換していった。2008年5月にリリースされた OpenJDK 6 ではオープンソース化できていない部分は1%となっていた。 2007年5月時点でオープンソース化できていなかった部分（OpenJDK 7 の4%）は次の通りである。 SNMP実装 オーディオエンジン全体。シンセサイザー部分も含め、後にオープンソースとなった。シンセサイザー部分はOpenJDKプロジェクトで Gervill と呼ばれるオープンソース版を新規開発した。 暗号関連クラス群は後にオープンソースとしてリリースされた。 フォントラスタライズと拡大縮小のコードは、オープンソースのFreeTypeで置換。 カラーマネージメントシステムは、オープンソースのLittleCMS（英語版）で置換。プラグイン可能なレイヤーがあるので、商用には本来のプロプライエタリなカラーマネジメントシステムを使うこともできる。 アンチエイリアス機能のあるグラフィックスラスタライザは、phoneME（英語版）プロジェクトで使っていたオープンソースのPiscesを採用。 JavaScriptプラグインはオープンソース化された（JavaScriptエンジンRhino自体は元からオープンソースである）。 2010年12月、「バイナリプラグ」と呼ばれていた部分は全てオープンソースの代替品で置換され、JDK全体がオープン化された。 Javaクラスライブラリの他のフリーソフトウェア実装としては、GNU Classpath がある。他の実装とは異なり、これはクラスライブラリのみを実装しており、多くのフリーなJava実装（ランタイム）、Kaffe、SableVM、JamVM（英語版）、CACAO（英語版） などで使われている。 Apache Harmony もクラスライブラリのフリーソフトウェア実装だった。これにはJava仮想マシンとJavaコンパイラなども含まれており、Javaスタック全体をフリーソフトウェアで実装することを目的としていた。