クラスパスは、アプリケーションが参照するクラスを見つけるために、Javaコンパイラ(コマンド:javac)とJVM(コマンド:java)が検索する場所です。アプリケーションが別のクラスを参照することはどういう意味ですか?簡単に言うと、そのクラスをコードのどこかで使用することを意味します。
例:
public class MyClass{
private AnotherClass referenceToAnotherClass;
.....
}
これ(javac)をコンパイルしようとすると、コンパイラにはAnotherClassクラスが必要になります。アプリケーションを実行しようとする場合も同じです。JVMにはAnotherClassクラスが必要です。このクラスを見つけるために、javacとJVMは特定の(セットの)場所を調べます。これらの場所は、Linuxではコロンで区切られたディレクトリのリストであるクラスパスによって指定されます(必要なときにAnotherClassを見つけるためにjavac / JVMが検索するディレクトリ)。
したがって、クラスをコンパイルして実行するには、クラスパスにAnotherClassクラスを含むディレクトリが含まれていることを確認する必要があります。次に、次のように呼び出します。
javac -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass.java //to compile it
java -classpath "dir1;dir2;path/to/AnotherClass;...;dirN" MyClass //to run it
通常、クラスはjarファイル/ライブラリと呼ばれる「バンドル」の形式で提供されます。この場合、AnotherClassクラスを含むjarがclasspahtにあることを確認する必要があります。
javac -classpath "dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass.java //to compile it
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN" MyClass //to run it
上記の例では、作業ディレクトリにあるクラス(MyClass.java)をコンパイルしてから、コンパイルされたクラスを実行する方法を確認できます(現在のディレクトリを表すクラスパスの先頭にある「。」に注意してください)。このディレクトリもクラスパスに追加する必要があります。そうしないと、JVMはそれを見つけることができません。
質問で指定したように、クラスがjarファイルにある場合は、必要な残りのディレクトリとともに、jarもクラスパスにあることを確認する必要があります。
例:
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" MyClass //to run it
またはより一般的(いくつかのパッケージ階層を想定):
java -classpath ".;dir1;dir2;path/to/jar/containing/AnotherClass;path/to/MyClass/jar...;dirN" package.subpackage.MyClass //to run it
アプリケーションを実行するたびにクラスパスを設定しないようにするために、CLASSPATHと呼ばれる環境変数を定義できます。
Linuxの場合、コマンドプロンプトで:
export CLASSPATH="dir1;dir2;path/to/jar/containing/AnotherClass;...;dirN"
または、〜/ .bashrcを編集して、この行を最後のどこかに追加します。
ただし、クラスパスは頻繁に変更される可能性があるため、クラスパスをdirのコアセットに設定することをお勧めします。これは頻繁に必要であり、そのセッションでのみ必要になるたびにクラスパスを拡張します。このような:
export CLASSPATH=$CLASSPATH:"new directories according to your current needs"