classpath是java編譯器(command:javac)和JVM(命令:java)查找的位置,以查找應用程序引用的類。 應用程序引用另一個類是什麼意思?在簡單的話就意味着某個地方使用這個類在其代碼:
例子:
public class MyClass{
private AnotherClass referenceToAnotherClass;
.....
}
當您嘗試進行編譯器(javac)編譯器將需要AnotherClass類。當您嘗試運行您的應用程序時也是如此:JVM將需要AnotherClass類。 爲了找到這個類,javac和JVM在一個特定的(一組)地方查找。這些地方是由類路徑指定的,它在linux上是一個以冒號分隔的目錄列表(javac/JVM在需要時用來查找AnotherClass的目錄)。
所以爲了編譯你的類然後運行它,你應該確保classpath包含包含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中和在某處末尾添加該線;
但是,類路徑會經常發生變化,因此您可能希望將類路徑設置爲您需要經常使用的核心dirs集,然後每次只需要該會話時擴展該類路徑。像這樣:
export CLASSPATH=$CLASSPATH:"new directories according to your current needs"
[包括Java類路徑中目錄中的所有jar文件]的可能的副本(https://stackoverflow.com/questions/219585/including-all-the-jars-in-a-directory -within-the-java-classpath) – Stewart 2017-10-04 11:50:28