Javaクラスライブラリ
Javaクラスライブラリ(ジャバクラスライブラリ、JCL)はJavaアプリケーションが実行時に呼び出せる動的ロード可能なライブラリ群である。また、特にJREが提供している java.lang
名前空間他の基本的なクラスを含むライブラリを指すこともある。このライブラリがそれぞれのオペレーティングシステム (OS) あるいはプロセッサ (CPU) の固有機能やシステムライブラリなどを隠蔽して抽象化・標準化する吸収層として働くことで、JavaアプリケーションなどがOSなどのプラットフォームに直接依存することを避けられるようになっている[1]。
JCLはJavaプラットフォーム内で次の3つの役割を担っている。
- 他の標準ライブラリと同様、コンテナクラス群や正規表現処理といったよく知られている便利な機能群をプログラマに提供する。
- ネットワークアクセスやファイルアクセスといったハードウェアやOSに強く依存するタスクへの抽象インタフェースを提供する。
- 中には、Javaアプリケーションが期待している機能を完備していないプラットフォームも存在する。その場合、欠けている機能をこのライブラリでエミュレートしたり、特定機能の有無をチェックする一貫した方法を提供したりする。
実装と設定
[編集]JCLはほぼ全体がJavaで書かれているが、ハードウェアやOSに直接アクセスする必要のある部分はその限りではない(例えば、入出力、ビットマップグラフィックス)。そのようなアクセスを行うクラスでは、一般にOSのAPIへのラッパーとして Java Native Interface を使用している。
JCLのほぼ全体が単一のJavaアーカイブファイル "rt.jar" に格納されており、JREやJDKの一部として配布されている。Javaクラスライブラリ (rt.jar) はデフォルトのブートストラップクラスパスに置かれ[2]、アプリケーションが一々クラスパスを指定する必要はない。ランタイムでは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ライセンスで公開した[3]。その後は、公開できなかった部分をオープンソース化することが目標となった。
オープンソース化できなかった部分は使わないとしても依存関係があるためにビルドには必須であり、「バイナリプラグ」と呼ばれた[4]。サン(と後にオラクル)はコミュニティの協力も得て、バイナリプラグをオープンソース化したりオープンソースの代替品で置換していった。2008年5月にリリースされた OpenJDK 6 ではオープンソース化できていない部分は1%となっていた[5][6]。
2007年5月時点でオープンソース化できていなかった部分(OpenJDK 7 の4%)は次の通りである[7][8]。
- SNMP実装[8]
- オーディオエンジン全体。シンセサイザー部分も含め、後にオープンソースとなった[8][9]。シンセサイザー部分はOpenJDKプロジェクトで Gervill と呼ばれるオープンソース版を新規開発した。
- 暗号関連クラス群は後にオープンソースとしてリリースされた[10]。
- フォントラスタライズと拡大縮小のコードは、オープンソースのFreeTypeで置換[11][12][13]。
- カラーマネージメントシステムは、オープンソースのLittleCMSで置換[12]。プラグイン可能なレイヤーがあるので、商用には本来のプロプライエタリなカラーマネジメントシステムを使うこともできる。
- アンチエイリアス機能のあるグラフィックスラスタライザは、phoneMEプロジェクトで使っていたオープンソースのPiscesを採用[12][14]。
- JavaScriptプラグインはオープンソース化された(JavaScriptエンジンRhino自体は元からオープンソースである)[15]。
オープンソースライセンス
[編集]2010年12月、「バイナリプラグ」と呼ばれていた部分は全てオープンソースの代替品で置換され、JDK全体がオープン化された[16]。
代替実装
[編集]Javaクラスライブラリの他のフリーソフトウェア実装としては、GNU Classpath がある。他の実装とは異なり、これはクラスライブラリのみを実装しており、多くのフリーなJava実装(ランタイム)、Kaffe、SableVM、JamVM、CACAO などで使われている。
Apache Harmony もクラスライブラリのフリーソフトウェア実装だった。これにはJava仮想マシンとJavaコンパイラなども含まれており、Javaスタック全体をフリーソフトウェアで実装することを目的としていた。
脚注
[編集]- ^ OSごとに違いのある部分(パス名の区切りなど)をアプリが意図的に踏めば、プラットフォーム依存は発生し得る。
- ^ How Classes are Found
- ^ Rich Green (2007年5月8日). “Open JDK is here!”. Sun Microsystems. 2011年11月25日閲覧。
- ^ “OpenJDK Binary Plugs”. Sun Microsystems (2007年5月8日). 2011年11月25日閲覧。
- ^ Angel, Lillian (2008年3月13日). “OpenJDK to replace IcedTea in Fedora 9”. 2012年12月10日時点のオリジナルよりアーカイブ。2008年4月5日閲覧。
- ^ Wade, Karsten (2008年3月13日). “OpenJDK in Fedora 9!”. redhatmagazine.com. 2008年4月5日閲覧。 “Thomas Fitzsimmons updated the Fedora 9 release notes source pages to reflect that Fedora 9 would ship with OpenJDK 6 instead of the IcedTea implementation of OpenJDK 7. Fedora 9 (Sulphur) is due to release in May 2008.”
- ^ Herron, David (2007年10月4日). “Plans for OpenJDK”. 2007年10月9日閲覧。
- ^ a b c “OpenJDK 6 b10 source posted” (2008年5月30日). 2008年6月1日閲覧。
- ^ audio-engine project page
- ^ “Crypto has been added to OpenJDK” (2007年9月27日). 2007年10月7日閲覧。
- ^ font-scaler projectpage
- ^ a b c Java2D project page
- ^ “Freetype font rasteriser” (2007年8月7日). 2007年11月24日閲覧。
- ^ graphics-rasterizer project page
- ^ “Javascript is encumbered and there is no javascript plugin support.”. IcedTea (2008年3月11日). 2008年6月1日閲覧。 “Changing Summary. JavaScript is no longer encumbered, but we still need liveconnect support.”
- ^ Kelly O'Hair (December 2010). “OpenJDK7 and OpenJDK6 Binary Plugs Logic Removed”. Oracle Corporation. 2011年11月25日閲覧。