クラスパス

**クラスパス**は、Java仮想マシンやJavaコンパイラにユーザーが定義した、コマンドライン上と環境変数を通じて設定される、クラスとパッケージを見付けるための場所を示す引数である。

## 概要とアーキテクチャ

伝統的に有名な動的読み込みに似て、Javaプログラムを実行する場合、Java仮想マシンはゆっくりとクラスを見付けロードする（Java仮想マシンは、クラスが最初に使用される場合のみクラスのバイトコードをロードする）。クラスパスは、これらのクラスを定義するファイルのためのファイルシステムがどこにあるかを探すように、Javaを指示する。

仮想マシンは以下の順序でクラスを検索しロードする :

#ブートストラップクラス : Javaプラットフォームにおける（Javaクラスライブラリのパブリックなクラスと、このライブラリに対して機能上必要なプライベートなクラスを構成する）基礎的なクラス。
#拡張クラス : JREやJDKの、jre/lib/ext/の*拡張*ディレクトリ内にあるJavaパッケージ。
#ユーザ定義パッケージやライブラリ。

デフォルトではJDK標準APIと拡張パッケージのみが場所を指定する必要がなくアクセス可能である。全てのユーザーが定義したパッケージとライブラリは、コマンドラインで（またはクラスを含むJarファイルに関連付けられたマニフェストファイル内に）設定しなければならない。

## Javaプログラムを実行するためのパスの設定
参考:
### 基本的な使用法
クラスを含んだ*org.mypackage*と呼ばれるパッケージがあると仮定しよう。

* *HelloWorld*（メインクラス）
* *SupportClass*
* *UtilClass*

そしてこのパッケージを定義するファイルは、*D:\myprogram*（Windows上）や*/home/user/myprogram*（Linux上）といったディレクトリ配下に物理的に保存される。

ファイル構造は以下のようである。

Javaを呼び出す場合、起動するアプリケーションの名前を指定する : org.mypackage.HelloWorld。しかしながら、Javaに、どこにファイルとディレクトリがあるかを探すように示さねばならない。それを行うため、以下のコマンドを使用する。

場所 :

* *-classpath D:\myprogram*は、プログラムで使用されるパッケージにパスを設定する(Linuxでは、*-classpath /home/user/myprogram*）
* *org.mypackage.HelloWorld*はメインクラスの名前である。

D:\myprogram\でJavaを起動する場合、Javaはクラスを含むファイルに対しカレントワーキングディレクトリクラスパスを指定する必要がないことに注意すること。

### ディレクトリ内の全てのJARファイルの追加
Java 6以降において、ワイルドカード表記を用いることで、一つで指定されたディレクトリ内の全てのjarファイルを追加することができる。

Windowsの例 :

```
java -classpath ".;c:\mylib\*" MyApp
```


Linuxの例 :

```
java -classpath '.:/mylib/*' MyApp
```


### 環境変数を通じたパスの設定
CLASSPATHと名付けられた環境変数を、代わりにクラスパスの設定に使用することができる。上記の例で、Windowsでは以下も使える。

正式なJDKバージョンを指示している場合、JAVA_HOMEもチェックしなければならない場合もある。

```
set CLASSPATH=D:\myprogram
java org.mypackage.HelloWorld
```


### Jarファイルのパス設定
今、プログラムがサポートする、*supportLib.jar*と呼ばれる、物理的にディレクトリ*D:\myprogram\lib\*に置かれたJarファイルで囲まれたライブラリを使用していることを考えよう。

当てはまる物理ファイル構造は以下である。


```
D:\myprogram\
      |
      ---> lib\
            |
            ---> supportLib.jar
      |
      ---> org\
            |
            --> mypackage\
                       |
                       ---> HelloWorld.class
                       ---> SupportClass.class
                       ---> UtilClass.class
```


以下のコマンドラインオプションを使用すべきである。

 java -classpath D:\myprogram;D:\myprogram\lib\supportLib.jar org.mypackage.HelloWorld

または代わりとして 

 set CLASSPATH=D:\myprogram;D:\myprogram\lib\supportLib.jar
 java org.mypackage.HelloWorld

### マニフェストファイル内のパス設定
プログラムがサポートする、*helloWorld.jar*と呼ばれる、物理的にディレクトリ*D:\myprogram\*に置かれたJarファイルで囲まれたライブラリを使用していることを考えよう、ファイル構造は以下である 

```
D:\myprogram\
      |
      ---> helloWorld.jar 
      |
      ---> lib\  
            |
            ---> supportLib.jar
```

このJarファイルで定義されたマニフェストファイルは以下の定義を持つ 。

```
Main-Class: org.mypackage.HelloWorld
Class-Path: lib/supportLib.jar
```


注意 : マニフェストファイルの終わりは新しい行かキャリッジリターンであることが重要である。

また、この場合のクラスパス文字列は、helloWorld.jarの位置に関連したsupportLib.jarファイルの場所を述べており、絶対ファイルパスではない（それは例えばコマンドラインの-classpath引数で設定することもある）ことに注意すること。このため、実際のJarファイルの場所とそのサポートライブラリは二者間で保持される相対ディレクトリ構造と同じくらい無関係である。

このプログラムを起動するため、以下のコマンドを使用する :
 java -jar D:\myprogram\helloWorld.jar

クラスパスがマニフェストファイルに既に定義されているため、プログラムクラスやサポートライブラリクラスへのクラスパスは定義する必要はない。

注意することは、起動するメインクラスを定義するためには役に立たず、Jarファイルのマニフェストは形式の行を含まなければならないことである。

```
Main-Class: classname
```

-jarオプションはJavaDocの処理をするためである。

マニフェストファイル内の、複数のライブラリJarファイルを指定するための文法は、空白によりエントリを分割する :

```
Class-Path: lib/supportLib.jar lib/supportLib2.jar
```


## OS特有の注意
ファイルシステムへと密接に関連付けられているため、コマンドライン引数のクラスパスのシンタックスはオペレーティングシステム (OS) に依存する。例えば:

*（LinuxやmacOSのような）全てのUnix系オペレーティングシステムにおいては、ディレクトリ構造はUnixシンタックスであり、コロン (":") によりファイルパスは分割される。
* Windowsにおいては、ディレクトリ構造はWindowsシンタックスであり、各ファイルパスはセミコロン (";") で分割されなければならない。

これはクラスパスがマニフェストファイルに定義された場合には適用されない。オペレーティングシステムによらず、空白("&nbsp;")で各ファイルパスを分割しなければならない。

## 診断
アプリケーションプログラマは、アプリケーションの起動中、現在の設定を以下の方法で見付けたりデバッグすることができる :


```
System.getProperty("java.class.path")
```
 [JavaDoc](https://docs.oracle.com/javase/jp/6/api/java/lang/System.html#getProperties())

## 脚注

## 外部リンク
* オラクルサイトによるJavaクラスを見付ける方法の説明の注意
* オラクルサイトによるクラスパスの仕様と設定方法
* Javaインストール方法の仕様