對於 Java 初學者來說,Classpath 往往是最令人困惑的概念之一。為什麼在開發環境裡運行良好的程式,部署到別處卻報錯?或者在外部能跑的程式,放進 IDE 卻死活跑不起來?本文將徹底解析 Classpath 的運作機制,助你一勞永逸地解決這類問題。
Java 的優勢在於其網絡化特性。假設一個應用程式同時依賴 java.lang.String(核心類別)與 com.shinechina.MyClass(自定義類別,且存在兩個不同版本)。當你輸入 java com.shinechina.MyClass 時,JVM 面臨一個關鍵抉擇:究竟該載入哪個版本?
package com.shinechina;
public class MyClass {
public static void main(String args[]) {
String str = "版本1: hello, welcome to chinaASP Java 技術";
System.out.println(str);
}
}
package com.shinechina;
public class MyClass {
public static void main(String args[]) {
String str = "版本2: hello, welcome to chinaASP Java 技術";
System.out.println(str);
}
}
編譯兩個版本:
cd c:\mylib\com\shinechina
javac *.java
cd d:\mylib\com\shinechina
javac *.java
假設系統 CLASSPATH 為 c:\mylib;d:\mylib;d:\jdk1.2.2\lib\rt.jar。JVM 會依序搜尋:
c:\mylib 找到 com\shinechina\MyClass.class → 載入版本 1d:\mylib 的版本 2 被忽略String 從 rt.jar 載入執行結果:版本1: hello, welcome to chinaASP Java 技術
若將 d:\mylib 放在 c:\mylib 之前,結果就會變成版本 2。結論明確:類路徑上第一個被找到的類別將被載入,其餘同名類別全部忽略。
透過 -classpath 參數可動態指定優先順序:
java -classpath d:\mylib;%classpath% com.shinechina.MyClass
此時輸出變為:版本2: hello, welcome to chinaASP Java 技術
開發環境(如 Eclipse、IntelliJ IDEA)本質上也是透過專案設定來管理這個類路徑順序。掌握這個原理,Classpath 難題便迎刃而解。