Java 套件機制解決了類別命名衝突與類別檔案管理的兩大核心問題。由於套件由多個 .class 檔案組成,不像單一檔案那樣容易封裝,Java 採用目錄階層結構對應套件名稱,並強制要求套件名稱第一部分為開發者的網域名稱(反轉順序),確保全域唯一性。
根據慣例,編譯器強制套件名稱首段為網域名稱(由 InterNIC 保證唯一)。例如作者的網域 bruceeckel.com 反轉為 com.bruceeckel,再細分為 com.bruceeckel.util。若無自有網域,建議使用極罕見的名稱(如英文姓名)或申請低成本網域。
Java 解譯器透過環境變數 CLASSPATH 尋找類別檔案。CLASSPATH 包含一或多個根目錄,解譯器將套件名稱中的點號替換為斜線,生成相對路徑。例如 com.bruceeckel.util 對應 com/bruceeckel/util 目錄,再結合 CLASSPATH 中的各項目進行搜尋。
// Vector.java
package com.bruceeckel.util;
public class Vector {
public Vector() { System.out.println("com.bruceeckel.util.Vector"); }
}
// List.java
package com.bruceeckel.util;
public class List {
public List() { System.out.println("com.bruceeckel.util.List"); }
}
這兩個檔案放置於 C:\DOC\JavaT\com\bruceeckel\util,CLASSPATH 設為 .;D:\JAVA\LIB;C:\DOC\JavaT。使用時透過 import com.bruceeckel.util.*; 匯入。
Java 編譯器具備自動編譯功能:當偵測到 .java 比 .class 新時,會自動重新編譯。若透過 import com.bruceeckel.util.*; import java.util.*; 同時匯入兩個含有 Vector 類別的套件,僅在實際使用 Vector 時才會發生衝突。解決方式是使用完整限定名稱 java.util.Vector 明確指定。
CLASSPATH 根目錄 + 套件路徑 = 類別檔案實際位置