編譯器與 CLASSPATH


在  JavaGossipLabs / Labs / CLASSPATH-javac / 中有個 classes 目錄,請複製到C:\workspace中,確認C:\workspace\classes中有個已編譯好Console.class,你可以在C:\workspace中開個Main.java,如下使用Console類別:

public class Main {
    public static void main(String[] args) {
        Console.writeLine("Hello World");
    }
}

如果你如下編譯,將會出現錯誤訊息:

找不到Console類別的編譯錯誤

編譯器在抱怨,它找不到Console類別在哪裡(cannot find symbol),事實上,在使用javac編譯器時,如果要使用到其它類別程式庫時,也必須指定CLASSPATH,告訴javac編譯器到哪邊尋找.class檔案。例如:

編譯成功,但執行時找不到Console類別的錯誤

這一次編譯成功了,但無法執行,原因是執行時找不到Console類別,因為你執行時忘了跟JVM指定CLASSPATH,所以JVM找不到Console類別。如果如下執行就可以了:

找到Console與Main執行成功

別忘了,如果執行JVM時指定了CLASSPATH,就只會在指定的CLASSPATH中尋找使用到的類別,所以上圖指定CLASSPATH時,是指定「.;classes」,注意一開始的「.」,這表示目前資料夾,這樣才可以找到目前資料夾下的Main.class,以及classes下的Console.class。

javac等工具程式,大多也是Java撰寫的,執行於JVM之上,這也就是為何,javac需要相關.class檔案路徑資訊時,也是用CLASSPATH指定的原因,雞生蛋?蛋生雞? 有進一步探討。