classpathは、Javaのクラスファイル(.classファイル)のパスを示します。DOS環境での使用方法について以下に説明します。
最初のケース、パッケージが指定されていない場合:
Eドライブに「demo」というフォルダを作成し、その中に「a」、「b」、「c」の3つのサブフォルダを作ります。「b」フォルダ内に以下のB.javaファイルを作成します:
public class B {
public String sayHi(String name) {
return "Hi! " + name;
}
}
次に、「a」フォルダ内にA.javaファイルを作成します。このファイルではBクラスを使用しています:
import java.util.Date;
public class A {
public static void main(String[] args) {
System.out.println(new B().sayHi("zhangsan"));
System.out.println(new Date());
}
}
DOS環境でe:/demo/aに移動し、javac A.javaを実行するとエラーが発生します。デフォルトのclasspathは現在のディレクトリを探しますが、Bクラスを見つけることができません。そのため、-classpathオプションを使ってclasspathを指定します:javac -classpath e:/demo/b A.java
さらにjava Aを実行すると再度エラーが発生します。-classpathは一時的な指定であり、java -classpath e:/demo/b Aを実行するとAクラスが見つからないというエラーが出ます。パスにセミコロン(;)を追加することで解決できます。セミコロンは現在のディレクトリを表し、先頭に配置するとまず現在のディレクトリから探してから指定されたディレクトリを探します。つまり、java -classpath ;e:/demo/b Aまたはjava -classpath e:/demo/b; Aとします。
もしjavac B.javaを実行すると、ファイルが見つからないというエラーが出るので、絶対パスを指定する必要があります。
次のケース、パッケージが指定されている場合:
A.javaを以下の通り変更します:
package a;
import java.util.Date;
import b.B;
public class A {
public static void main(String[] args) {
System.out.println(new B().sayHi("zhangsan"));
System.out.println(new Date());
}
}
B.javaも以下の通り変更します:
package b;
public class B {
public String sayHi(String name) {
return "Hi! " + name;
}
}
DOS環境でe:/demo/aに移動し、javac A.javaを実行するとエラーが発生します。import時に現在のディレクトリ内でbを探しますが見つからないため、javac -classpath e:/demo A.javaと指定します。
またはe:/demoに移動し、相対パスを使用してjavac a/A.javaとすることも可能です。
e:/demo/aでjava Aを実行するとAクラスが見つからないというエラーが出ます。これは現在のディレクトリからa/A.javaを探すことになるためです。そのためe:/demoに移動し、java a.Aと実行します。
ここで完全なクラス名(パッケージ名を含む)を使用します。また、-classpathでBクラスのパスを指定する必要はありません。import時に現在のディレクトリから順に探すからです。
bフォルダをcフォルダに移動した場合、e:/demo/aでjavac -classpath e:/demo A.javaを実行するとエラーが発生します。これをjavac -classpath e:/demo/c A.javaに変更します。
e:/demoに移動し、javac a/A.javaを実行するとエラーが発生します。これをjavac -classpath e:/demo/c a/A.javaに変更します。
e:/demoでjava a.Aを実行するとエラーが発生します。これをjava -classpath ;e:/demo/c a.Aまたはjava -classpath e:/demo/c; a.Aに変更します。
最後に、パッケージがある場合、-classpathはパッケージの親ディレクトリを指定します。例えば、B.javaがbパッケージにある場合、-classpathはe:/demo/cではなくe:/demo/c/bを指定します。実行時にはパッケージパスを含めて指定します。例えば、java a.A、java b.Bのようにします。