Java

拡張機能 - 概要

目次

拡張機能とは

拡張機能は、Java クラスとそれに関連するネイティブコードのパッケージです。拡張機能を使うことにより、アプリケーションの開発者はコアプラットフォームの機能を拡張できます。拡張機能機構により、ブートストラップクラスとほとんど同じように Java Virtual Machine から拡張機能クラスを利用できます。ブートストラップクラスは、コアプラットフォームを実装しているクラスであり、jre/lib/rt.jar および jre/lib/i18n.jar にあります。これらの jar ファイルには、java.langjava.io などのコア API のクラス、およびプラットフォームの国際化および地域対応の機能をサポートするクラスが格納されます。ブートストラップクラスと同様に、拡張機能のクラスはクラスパスに置く必要はありません。拡張機能機構では、必要な拡張機能が JRE または JDK ソフトウェアにインストールされていない場合に、指定された URL からそれを取得する方法も提供します。

拡張機能は、JAR ファイルの形で提供され、すべての JAR ファイルは拡張機能になり得ます。JAR ファイルが拡張機能の役割を果たすのは、次の 2 つの場合です。

VM は、ある名前のクラスを探すとき、最初にブートストラップクラスを検索します。ブートストラップクラスの中に目的のクラスがない場合は、次にインストール型拡張機能からそのクラスを検索します。ブートストラップクラスからもインストール型拡張機能からも見つからない場合は、アプリケーションまたはアプレットが参照しているダウンロード型拡張機能を検索します。ブートストラップクラスと拡張機能クラスのどちらでもクラスを検索できない場合は、VM はクラスパスだけを検索します。

インストール型拡張機能

インストール型拡張機能は、次のディレクトリに置かれた JAR ファイルです。
jre/lib/ext
jre ディレクトリは、Java Runtime Environment のトップレベルのディレクトリ、または JDK ソフトウェアのディレクトリ階層にある jre ディレクトリのどちらかです。このディレクトリに JAR ファイルを置いておけば、CLASSPATH に明示的に含めなくても、中に含まれるクラスをブートストラップクラスの一部であるかのようにアプレットおよびアプリケーションから使用できます。

インストール型拡張機能のネイティブコードバイナリは、存在する場合には次のディレクトリに置きます。

jre¥bin         [Win32]
jre/lib/<arch>  [Solaris]
<arch> は、Solaris プロセッサアーキテクチャで、sparci386 です。ネイティブライブラリもまた、Win32 と Solaris のどちらでも jre/lib/ext/<arch> に置かれ、Win32 システムでは、<arch>i386 になります。jre/lib/ext/<arch> ディレクトリは、jre¥bin (win32) または jre/lib/<arch> (Solaris) の次に検索されます。

Java VM は、特定の名前のクラスを探すとき、最初にブートストラップクラスを検索します。ブートストラップクラスの中に目的のクラスがない場合は、jre/lib/ext に置かれた JAR ファイルからそのクラスを検索します。

JAR ファイルや、それに含まれるクラスは、jre/lib/ext に置かれることによってインストール型拡張機能となるのであって、インストール型拡張機能となる特別な JAR ファイルがあるわけではありません。

目的のクラスがブートストラップクラスからもインストール型拡張機能内のクラスからも見つからない場合は、ダウンロード型拡張機能が検索されます。

ダウンロード型拡張機能

ダウンロード型拡張機能は、別の JAR ファイルのマニフェスト内の Class-Path ヘッダフィールドで指定される JAR ファイルです。ダウンロード型拡張機能のクラスは、参照する JAR ファイルのクラスで使用されます。ある JAR ファイルにアプレットが含まれていて、その JAR ファイルのマニフェストで、そのアプレットの拡張機能となる JAR ファイル (複数の場合もあり) を参照しているというのが典型的な例です。これと同じようにして、拡張機能同士で互いに参照し合う場合もあります。

Class-Path ヘッダの例を次に示します。

Class-Path: servlet.jar infobus.jar acme/beans.jar
この場合、servlet.jarinfobus.jar、および acme/beans.jar に含まれるクラスが、マニフェストにこのヘッダが含まれる JAR ファイルのクラスの拡張機能になります。Class-Path フィールドに URL を指定した場合、その URL は、アプレットまたはアプリケーションが含まれる JAR ファイルの URL からの相対 URL になります。

インストール型拡張機能と違って、ダウンロード型拡張機能となる JAR ファイルが置かれる位置には何の意味もありません。ダウンロード型拡張機能は、ほかの JAR ファイルのマニフェストの Class-Path ヘッダの値として指定されるから拡張機能なのであって、特定の場所に置かれるから拡張機能になるのではありません。

インストール型拡張機能とダウンロード型拡張機能のもう 1 つの違いは、JAR ファイルに含められたアプレットやアプリケーションだけがダウンロード型拡張機能を利用できるという点です。JAR ファイルに含められていないアプレットやアプリケーションは、ダウンロード型拡張機能を参照するマニフェストを持ちません。

VM は、特定のクラスを探すとき、最初にブートストラップクラスとインストール型拡張機能を検索します。目的のクラスがブートストラップクラスからもインストール型拡張機能内のクラスからも見つからない場合は、アプリケーションまたはアプレットのマニフェストで参照しているダウンロード型拡張機能を検索します。目的のクラスがインストール型拡張機能の中から見つかった場合は、アプレットやアプリケーションのマニフェストファイルでダウンロード型拡張機能を参照していても、ダウンロード型拡張機能はダウンロードされません。

ダウンロード型拡張機能は、JRE または JDK のディレクトリ構造の中にはインストールされません。ダウンロード型拡張機能は、ダウンロードされてもインストール型拡張機能にはなりません。

ダウンロード型拡張機能の場合、インストール型拡張機能とは異なり、ネイティブコードを含めることはできません。

インストール型拡張機能を作成する際に考慮すべき点

あるクラスを拡張機能内に置くかどうかを判断する際に、考慮すべき点がいくつかあります。
  1. 拡張機能に、ファイルに対する読み込みや書き込みなどのセキュリティ関係の操作を実行するコードが含まれる場合、その種のコードに「特権」を設定することを考慮する必要があります。コードに特権を設定する場合は、コードを java.security.AccessController.doPrivileged への呼び出しで囲みます。詳細については、「セキュリティ」「特権ブロックのための API」 を参照してください。セキュリティマネージャは、特権が設定されているコードに対して、セキュリティに依存する操作の実行を許可することができます。拡張機能に、特権が設定されていないセキュリティに依存するコードが含まれていると、信頼されない (アプレット) コードがそのコードを呼び出しても動作しません。このようなことが発生してもかまわないのであれば、doPrivileged への呼び出しを省略することもできます。

  2. 拡張機能クラスは 1 つまたは複数の JAR ファイルにバンドルする必要があります。拡張機能のベンダー情報やバージョン情報を JAR ファイルのマニフェストに含めることもできます。詳細については、「JAR マニフェストフォーマット」を参照してください。マニフェスト内のバージョン情報を使うと、拡張機能のインストール時に、新しいバージョンのソフトウェアがすでにインストールされている場合にそれを上書きしないようにすることができます。JAR ファイルの一般的な情報については、JAR の機能に関する JDK のドキュメントを参照してください。

  3. 提供する拡張機能が、Java プラットフォームの拡張機能機構によって適切に使用されるように、インストールプログラムやインストールの説明書を用意する必要がある場合があります。拡張機能のためのクラスファイルやネイティブコードライブラリをインストールする適切な場所については、「インストール型拡張機能」 を参照してください。

Copyright © 1997, 1998 Sun Microsystems, Inc. All Rights Reserved. Sun

Java ソフトウェア