多數開發者僅將 JAR 視為構建產物,實則 JAR 規範(MANIFEST.MF、Class-Path、資源加載機制)蘊含強大部署能力。本文揭示 5 大實戰技巧,涵蓋可執行化、依賴傳遞、擴展目錄、通配符 Classpath、資源內嵌——同樣適用於 WAR/EAR。
無需 java -cp app.jar com.example.Main,只需在 MANIFEST.MF 聲明入口:
Main-Class: com.tedneward.jars.Hello
Ant 自動生成:
<jar destfile="outapp.jar" basedir="classes">
<manifest>
<attribute name="Main-Class" value="com.tedneward.jars.Hello"/>
</manifest>
</jar>
用戶執行:java -jar outapp.jar 或雙擊(GUI 環境)。
解決 -jar 忽略 -cp 的痛點,在 MANIFEST 聲明依賴 JAR 相對路徑:
<attribute name="Class-Path" value="
./lib/spring-context-3.0.1.jar
./lib/spring-core-3.0.1.jar
./lib/commons-logging-1.0.4.jar
"/>
將通用庫(如 JDBC 驅動、安全提供者)放入 $JRE_HOME/lib/ext:
java -cp "lib/*" com.example.Main
lib/* 展開為該目錄下所有 JAR(非遞歸)將配置文件、屬性文件、圖片等打入 JAR:
<jar destfile="app.jar" basedir="classes">
<fileset dir="conf" includes="**/*.properties, **/*.xml"/>
<fileset dir="resources" includes="**/*.png"/>
</jar>
代碼中通過 ClassLoader.getResourceAsStream() 訪問:
ClassLoader cl = SpeakEnglish.class.getClassLoader();
Properties props = new Properties();
props.load(cl.getResourceAsStream("com/tedneward/jars/responses.properties"));
ClassPathXmlApplicationContext 依賴 Classpath 定位 applicationContext.xml,內嵌至 JAR 即可file: 前綴或 Spring Profiles| 模式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 標準 JAR + Class-Path | 透明、標準、易理解 | Class-Path 單行限制、路徑易斷 | 中小型獨立應用 |
| Fat Jar (Spring Boot) | 單文件部署、無依賴地獄 | 體積大、啟動稍慢、資源加載需特殊處理 | 微服務、容器化部署 |
| 擴展目錄共享 | 節省磁碟、統一版本 | 版本衝突、污染全局環境 | 受控內部環境、插件架構 |
掌握 JAR 規範細節,能讓部署從「複製一堆文件」進化為「單一文件/單條命令」的專業體驗。