クラスパスの設定
クラスパスの憂鬱(ゆううつ)
クラスパスほどやっかいなものはない。もちろん、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ファイルが増えてくると、クラスパスの指定があまりにも面倒になるからだ。