クラスパス(classpath)とは?
JVM(Java Virtual Machine: Java仮想マシン)の中でクラスファイルを読み込む仕事は、クラスローダー(class loader)という機能が行っています。
クラスパスとは、このクラスローダーがクラスファイルを探すときに見に行くべき場所のことです。
例えば、クラスパスに「c:¥Desktop」が指定してある場合、クラスローダーはc:¥Desktopの中にクラスファイルがあるかを探しに行くだけでよくなります。
クラスパスを指定する方法
クラスパスを指定する方法は、以下の3通りあります。
- 起動時にjavaコマンドで指定する
- 検索場所をOSに登録する
- 特に指定しない
ひとつずつ、解説します。
起動時にjavaコマンドで指定する
最初の方法は、JVMをjavaコマンドで起動するときに「-cpオプション」または「-classpathオプション」を指定します。
具体的な指定方法は以下の通りです。
>java -cp c:¥Desktop "ファイル名"
サンプルを使って実際に動かしていきましょう。
↓Main.java
public class Main { public static void main(String[] args) { ClassPath cp = new ClassPath(); } }
↓ClassPath/ClassPath.java
public class ClassPath { public ClassPath() { System.out.println("ClassPathファイルを実行しました!"); } }
↓実行結果(Mac)
mbp:Desktop (ユーザー名)$ javac -cp .:ClassPath Main.java mbp:Desktop (ユーザー名)$ java -cp .:ClassPath Main ClassPathファイルを実行しました!
Macで実行しているため、複数のパスをコロン(:)で区切っています。
コロンの前にあるドット(.)は、相対パスです。現在いるフォルダを指定する場合に使用されます。
相対パスではなく絶対パスで実行するのであれば、以下のように記述すれば同じ実行結果が得られます。
mbp:Desktop (ユーザー名)$ javac -cp Desktop:ClassPath Main.java mbp:Desktop (ユーザー名)$ java -cp Desktop:ClassPath Main.java ClassPathファイルを実行しました!
絶対パスで取得するときは、2行目がMainが「Main.java」に変わるので注意しましょう。
検索場所をOSに登録する
Javaコマンドを入力する際に、いちいち指定するのが面倒な場合は検索場所をOSに登録しておくと便利です。
具体的には、OSの「環境変数」という設定にクラスパスを登録します。
これによって、javaコマンドは環境変数を自動的に読み込み、クラスファイルの検索に利用してくれます。
環境変数の設定は、WindowsとMac/Linuxの場合で異なるのでそれぞれ見ていきましょう。
Windowsの場合
Windowsの場合は、以下の手順で環境変数を設定できます。
- コントロールパネルを開く
- システム>システムの詳細設定を開く
- 詳細設定のタブを選ぶ
- 環境変数のボタンをクリック
ここから、ユーザー環境変数としてクラスパスを追加し、値を設定しましょう。
Mac/Linuxの場合
Mac/Linuxの場合は、「(ユーザーのホームディレクトリ)/.profile」ファイルの末尾を変更します。
例えば、「/var/javadev」をクラスパスとする場合は以下のように追記しましょう。
export CLASSPASS=/var/javadev
特に指定しない
検索場所をOSに登録せずjavaコマンドで指定もしない場合は、デフォルトでjavaコマンドが実行されたフォルダがクラスパスになります。
例えば、c:¥Desktopでjavaコマンドを実行すれば、c:¥Desktopがクラスパスに設定されるといった感じです。
クラスパスで指定できる対象
クラスパスで指定できる対象は、以下の3つから選べます。
- フォルダの場所
- クラスファイルが入ったjarファイルやzipファイル
- 複数フォルダ、jarファイルやzipファイル、それらの組み合わせ
ひとつずつ詳しく解説します。
フォルダの場所
クラスファイルが置かれている絶対パス(フォルダの場所)が指定できます。
最も一般的な指定対象で、例えば、c:¥Desktopを指定すると、Desktopのクラスファイルが検索の対象です。
クラスファイルが入ったjarファイルやzipファイル
クラスファイルが入ったjarファイルやzipファイルがあれば、そのファイルの絶対パスもクラスパスの対象にできます。
例えば、work.jarファイルがc:¥Desktop¥jarsに置いてある場合、
c:¥Desktop¥jars¥work.jar
と指定することで、クラスパスからクラスを読み込むことができます。
複数フォルダ、jarファイルやzipファイル、それらの組み合わせ
複数のフォルダやjarファイル、zipファイルをデリミタ文字で区切ってクラスパスの指定も可能です。
デリミタ文字はOSによって異なります。
- Windows → セミコロン(;)
- Mac/Linux → コロン(:)
です。
Windowsの場合は、以下のように記述します。
c:¥Desktop;c:¥Desktop¥jars¥work.jar
Mac/Linuxの場合は、以下のように記述します。
/var/javadev:/var/javadev/jars/work.jar
クラスパスの確認方法
プログラムを実行した際に、指定したクラスパスを確認したい時は、-verboseオプションを使いましょう。
「-verbose:class」と指定することで、クラスをロードするたびにクラスに関する情報を表示してくれます。
java -verbose:class "ファイル名"
クラスパスの取得方法
クラスパスはプログラムから取得することも可能です。
クラスパスを取得したい場合は、getPropertyメソッドを記述して取得します。
サンプルを見てみましょう。
↓Main.java
public class Main { public static void main(String[] args) { ClassPath cp = new ClassPath(); } }
↓ClassPath/ClassPath.java
public class ClassPath { public ClassPath() { System.out.println(System.getProperty("java.class.path")); } }
↓実行結果(Mac)
mbp:Desktop (ユーザー名)$ javac -cp .:ClassPath Main.java mbp:Desktop (ユーザー名)$ java -cp .:ClassPath Main .:ClassPath
まとめ
Javaのクラスパスの意味や指定方法、確認方法などをご紹介しました。
プログラムを組んでいく中でクラスは数多く使われるでしょう。
そんなとき、クラスがフォルダごとにしっかり分かれていると、後に修正や機能の追加をするときにファイルを探すのが簡単になります。
クラスパスを使いこなせるようになっておいて損はありません。ぜひ、この記事を参考にマスターしてください。
クラスパスを指定することで、高速にクラスファイルの検索が可能になるのです。