arrow 若葉プログラミング塾 > 知識の玉手箱 > ワンポイントTips >

クラスパスの設定

クラスパスの憂鬱(ゆううつ)

 クラスパスほどやっかいなものはない。もちろん、Javaで書いていると、わけのわからない例外が起こり、原因がさっぱりわからないこともしばしばある。 悩んだ挙句にライブラリとのバージョン不整合が判明したりして、むなしい気持ちになりがちではある。とはいえ、他の言語にくらべて憂鬱になる頻度はかなり低い。

 Javaが洗練された言語であるゆえんであろう。しかしクラスパスだけは別である。いつでも、何度でも、はまるのがクラスパスである。 そこでいまさらだが要点をまとめておく。

実行時のクラスパス指定

 実行時にパラメタで指定できる。

 UNIX/Linuxの場合

 以下の2パターンがある。

java -classpath <クラスパス1>:<クラスパス2> <クラスファイル>

または

java -cp <クラスパス1>:<クラスパス2> <クラスファイル>   --コロン( : )なんです

 Windowsの場合

java -classpath <クラスパス1>;<クラスパス2> <クラスファイル>

または

java -cp <クラスパス1>;<クラスパス2> <クラスファイル>   --セミコロン( ; )なんです

 なぜ憂鬱なのかちょっとわかってきた。なお、この指定を行った場合、デフォルトで設定されているカレント・ディレクトリへのクラスパスが無効となるので、 必要ならばトッド( . )を追加しなければならない。これを忘れるのがよくあるパターンその1。

なお、上記の例は2つのクラスパスを指定しているが、もちろん1つでもよいし、3つ以上でも指定できる。

環境変数によるクラスパスの指定

 開発を行っている者なら、必ずコンパイラのありかを環境変数PATH等で設定しているはずである。同じように、 コマンドプロンプトやバッチファイルやシェルスクリプト上でCLASSPATHを指定して、 これから実行しようとするクラスパスを(一時的に、あるいは永続的に)指定できる。

 UNIX/Linuxの場合

setenv CLASSPATH <クラスパス1>:<クラスパス2>    --csh系シェルの場合

または

CLASSPATH=<クラスパス1>:<クラスパス2>   --sh系シェルの場合
export CLASSPATH

 Windowsの場合

set CLASSPATH=<クラスパス1>;<クラスパス2>   --コマンドライン・バッチファイル

または

いつもの環境変数の設定方法による設定

jarファイルへのクラスパス

 憂鬱な理由がもうひとつあって、jarファイルがやっかいだ。

 たとえばカレントディレクトリにjarファイルがあって、クラスパスにはドット( . )が含まれていたとしても、 そのままではjarファイルを見に行ってはくれない。それもそのはず、jarファイルはあくまで、ディレクトリ構造を仮想的にアーカイブしたものなので、 実際にはcurrent_dir/foo/bar.classのように、サブディレクトリの下にclassファイルがあるのと同等であるからだ。

javaはクラスパスの指定のないjarファイルには見向きもしない。そこで、

java -cp <クラスパス1>;<クラスパス2>;<jarファイル> <クラスファイル>   --Windowsの場合

のように書かなくてはならない。

 それがなぜ面倒なだけでなく憂鬱であるかというと、回避策があるからだ。javaのランタイムライブラリは設定しなくても自動的に読み込まれる。 このメカニズムを利用して、よく使うjdbcドライバなどを、jdkのあるJAVA_HOME配下に置くと、起動時に勝手に読み込んでくれるのだ。 (詳細は教材を読んでください)

 これが便利すぎて、汎用性のないjarまで配下に置いてしまい、無意味にjarを読み込んでしまったり、どこにjarを置いたか忘れてしまって探す、 ということがしばしば起こる。よくあるパターンその2である。それというのも、jarファイルが増えてくると、クラスパスの指定があまりにも面倒になるからだ。

クラスパスの設定
arrow 若葉プログラミング塾 > 知識の玉手箱 > ワンポイントTips >
KC