タイトルJava Watch on the X》4 - アプリケーションをパッケージとしてビルドする(4)ライブラリについてカテゴリーProjectBuilder/Interface Builder, Java, Java Watch on the X
作成日2002/1/17 16:53:15作成者新居雅行
アプリケーションのパッケージをProject Builderで作成する場合のライブラリ利用についていくつか説明したが、さらに補足をしておこう。パッケージの作成によって、1つのjarファイルにクラスが全部パックされるのであるが、既存のjarファイルで供給されるライブラリを利用する場合、1つは、そのライブラリをパッケージに作るjarファイルにMergeしてしまう方法を説明した。もちろん、確実な方法だが、個別のアプリケーションごとにライブラリを持つことになり、ファイルサイズの増大やアップデートの問題も発生する。一方、MRJApp.propertiesファイルに記述する方法で、任意の場所にあるライブラリをパスで指定できた。ただし、この方法だと基本的には絶対パスで指定することになる。
ライブラリの利用方法としては、Javaの実行環境が持つ本来の機能を利用することができる。そもそも、クラスをどこから検索するのかということが設定されているわけであって、それにしたがってクラスを探してくる。詳細は以下の文書を参照すると良いだろう。

◇Getting Started with JavaTM 2: Tools and Configuration
 http://developer.java.sun.com/developer/technicalArticles/Programming/GettingStarted/

◇The Extension Mechanism
 http://java.sun.com/j2se/1.3/docs/guide/extensions/spec.html

ポイントを説明すると、Javaでのクラス検索を行う手続きとしては、まずはシステムプロパティのsun.boot.class.pathに設定されたパスをチェックする。ただし、sun.boot.class.pathは一般には、Javaの標準ライブラリのクラスがある場所であるため、基本的にはユーザによって変更を加えるための場所ではないと言えるだろう。続いて、システムプロパティのjava.ext.dirsにあるクラスを検索する。さらに、システムプロパティのjava.class.pathで指定されたパスを検索する。いずれも、jarファイルを指定するかディレクトリを指定するのが基本である。ディレクトリをしていした場合には、そのディレクトリにあるすべての.classおよび.jarファイルが検索対象となる。java.class.pathについては、javaコマンドの-classpathオプションで指定するのであるが、Mac OS Xのパッケージだと、MRJApp.propertiesファイルや、あるいはInfo.plistファイル(ターゲットの「アプリケーション設定」)で設定するということができるわけである。これらのシステムプロパティは、Mac OS X 10.1.2では、以下のような設定となっている。複数のパスが設定されているが、それぞれ、1行ごとに記載した。

◇sun.boot.class.path
/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Classes/classes.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Classes/ui.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Classes/i18n.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Classes/sunrsasign.jar

◇java.ext.dirs
/Users/msyk/Library/Java/Extensions
/Library/Java/Extensions
/Network/Library/Java/Extensions
/System/Library/Java/Extensions
/System/Library/Frameworks/JavaVM.framework/Versions/1.3.1/Home/lib/ext

◇java.class.path
(Info.plistないしはMRJApp.propertiesでの指定に従う)

したがって、ライブラリに相当するファイルは、java.ext.dirsにあるディレクトリにコピーして利用すれば、クラスパスに指定しなくても参照されて利用できるということになる。WebObjects 5.1やあるいはOpenBaseあたりは追加のjarファイルは「/Library/Java/Extensions」にコピーするようにとなっている。このディレクトリは、adminグループ、すなわち管理権限のあるグループに所属するアカウントであれば、読み書きができる。だから、インストール時に作ったアカウントで使う限りは、基本的にはユーザサイドでファイルをコピーしてもらえる場所であると言える範囲だろう。なお、java.ext.dirsには存在しないディレクトリの指定もあるが、場合によってはインストーラでそのディレクトリを作って(たとえば、ユーザのLibraryフォルダ)、ライブラリをコピーしてもいいかもしれない。「/Network…」があるのは、ネットワークを通じてライブラリファイル自体を共有することを想定しているのだろう。

なお、システムプロパティにあるjava.library.pathで指定されたパスは、通常はネイティブライブラリをおいておき、ClassLoaderのメソッドで名前を指定して、ライブラリをロードするという場所として用意されている。ここは、jarファイルをおく場所ではない。

結果的に、ライブラリは、クラスパスに含めるか、java.ext.dirsにおくのかということになる。ただし、それらのライブラリの動作は全く同一ではない。java.ext.dirsにおいたライブラリにあるクラスについては、publicなメソッドしか呼び出せない。privateなものはもともと別のクラスからは呼び出せないのであるが、ライブラリの指定場所の違いは、publicもprivateもつけていないメソッドで出てくるのである。
クラスパスに含めたライブラリにある、publicもprivateもつけてないメソッドは、呼び出すことができる。だが、java.ext.dirsにあるライブラリにある、publicもprivateもつけてないメソッドを呼び出すと、実行時に「java.lang.IllegalAccessError」という例外が発生する。

(この項、続く)
関連リンク