|
いままで、クラスパスをとりあえず通していた方も多いかと思います。ではなぜクラスパスを通さなければいけないのでしょうか?話は非常に簡単です。クラスパスはあるコードが実行されたときJVMがクラスのバイトコード(*.classファイル)を探しに行く場所の指定です。つまりクラスの探索範囲だと思ってください。通常クラスパスは実行時のコマンドライン(javaやjavac)や、環境変数で引き渡されます。コマンドラインの時には下記のように「-classpath」オプションによって行います。
| パス区切り文字(赤字)に注意!Windowsの場合はセミコロンでUNIX系の場合はコロン |
| Windowsの場合 |
| javac -classpath .;c:\javastudy;wowtool.jar
test.java |
| |
| UNIX系の場合 |
| javac -classpath .:/home/makino/javastudy:wowtool.jar
test.java |
ではクラスパスを通すときのディレクトリの指定方法を説明します。クラスパスと言うのは物理的にクラスファイルが存在するディレクトリを指定すればよいわけではありません。以下のクラスに関するクラスパスについて考えてみましょう。
|
例:Testクラス
|
| パッケージ |
jp.co.wownet.common.cpath |
| クラス名 |
Test |
| フルパスのクラス名 |
jp.co.wownet.common.cpath.Test |
| 物理的なフルパスのクラスファイル |
(Win)
c:\javastudy\jp\co\wownet\common\cpath\Test.class |
| |
(UNIX)
/home/makino/javastudy/jp/wownet/common/cpath/Test.class |
|
このクラスを利用するときには下記のディレクトリに対してクラスパスを設定します。
(Win) c:\javastudy
(UNIX) /home/makino/javastudy
なぜ「c:\javastudy\jp\co\wownet\common\cpath」をクラスパスにしてはいけないのでしょうか?それは「jp以下はパッケージに対応するディレクトリ」だからです。つまりJVMに対してクラスパスとして通知すれば良いのは「パッケージ無しのクラスが配置されるディレクトリ」です。これは一般に「クラスルート」などと呼ばれます。クラスルート以降はJavaのパッケージの概念なので、JVMがパッケージ名にしたがってクラスルートからディレクトリを探索することができます。要するにクラスパスを通すと言うのは、ディレクトリを「クラスルートに追加」すると言う行為なのです。また利用したい、もしくは利用しているクラスは必ずクラスパスで指定されたディレクトリ内になければなりません。仮にクラスパスに含まれないクラスを利用しているプログラムを実行したとしたら、ClassNotFoundExceptionが発生しプラグラムが中断されます。ちなみにJARファイルは、解凍をすると、その直下にクラスファイルやパッケージディレクトリが存在するので「クラスルート」そのものだと思って構いません。そのためクラスパスの指定時にはディレクトリ、もしくはJARファイルが指定できるのです。
|
例:クラスパスとクラスローダー
|
|
|
| このようにクラスを探し出すクラスローダーはクラスパスで設定されたディレクトリの範囲内しかクラスファイルを探しにいけません。 |
|