對於 Java 初學者,javac 和 java 是最先接觸的命令,但即便是這兩個基礎指令,若不理解背後的類路徑與包機制,輕易就會讓人「頭皮發麻」。本文將從包的編譯運行機制切入,詳細講解如何手動打包可執行的 JAR 檔案,助你建立扎實的構建認知。
Java 要求包名與目錄層級一一對應。以 Partners 包下的 Tom 和 Jerry 類為例:
// Tom.java
package Partners;
public class Tom { public String toString() { return "It's Tom"; }}
// Jerry.java
package Partners;
public class Jerry {
public static void main(String[] args) {
Tom tom = new Tom();
System.out.println(tom + " and I am Jerry.");
}
}
編譯時務必使用 -d 指定輸出根目錄,JVM 會自動建立包對應的目錄樹:
javac -d . Tom.java Jerry.java
執行後生成結構:
.
└── Partners
├── Tom.class
└── Jerry.class
若省略 -d,需手動建立目錄並移動 .class 檔案,極易出錯。JVM 尋找類時,會將完整類名 Partners.Tom 轉為路徑 Partners/Tom.class,因此運行命令必須在包根目錄的上一層執行:
java Partners.Jerry
JAR 本質是 ZIP 壓縮包,若要雙擊或 java -jar 執行,必須在 META-INF/MANIFEST.MF 中指定主類:
Main-Class: Partners.Jerry
建立 MANIFEST.mf 檔案(注意末尾需有換行),放置於包根目錄同級:
.
├── Partners
│ ├── Tom.class
│ └── Jerry.class
└── MANIFEST.mf
jar cvfm test.jar MANIFEST.mf Partners
c:建立新檔案v:顯示詳細過程f:指定檔案名m:引入自訂 Manifestjava -jar test.jar
若為 Applet 類應用,需在主類中啟動 init() 和 start(),並建立 JFrame 承載,雙擊 JAR 即可看到視窗。
bin 目錄,便於直接呼叫 javac/java。. (當前目錄)、dt.jar、tools.jar 及第三方庫。IDE 通常自動管理,命令列開發需手動設定。掌握手動編譯、包目錄對應、Manifest 配置與 JAR 打包流程,是理解 Maven/Gradle 等構建工具底層邏輯的基石。建議初學者多實踐幾次,養成「目錄即包名」的肌肉記憶。