首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JAR 文件進階指南:可執行、依賴管理、資源封裝與通配符 Classpath

     編輯:Java 相關知識

前言:JAR 不只是「裝 class 的 zip」

多數開發者僅將 JAR 視為構建產物,實則 JAR 規範(MANIFEST.MF、Class-Path、資源加載機制)蘊含強大部署能力。本文揭示 5 大實戰技巧,涵蓋可執行化、依賴傳遞、擴展目錄、通配符 Classpath、資源內嵌——同樣適用於 WAR/EAR。

技巧 1:一鍵運行 —— Main-Class 屬性

無需 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 環境)。

技巧 2:隱式依賴傳遞 —— Class-Path 屬性

解決 -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
"/>
  • 路徑相對於應用 JAR 位置
  • 所有依賴必須寫在**同一行**(MANIFEST 規範限制)
  • 啟動時自動拼裝完整 Classpath

技巧 3:全局共享庫 —— 擴展目錄 (lib/ext)

將通用庫(如 JDBC 驅動、安全提供者)放入 $JRE_HOME/lib/ext:

  • JVM 啟動自動掃描,無需任何 Classpath 配置
  • 適用於多應用共享同版本庫的場景
  • 注意:版本衝突風險,生產環境謹慎使用

技巧 4:Java 6+ 通配符 Classpath

java -cp "lib/*" com.example.Main
  • lib/* 展開為該目錄下所有 JAR(非遞歸)
  • 適用於啟動腳本、工具類、代碼生成器等開發時期工具
  • 不支援 MANIFEST Class-Path 屬性

技巧 5:資源內嵌 —— ClassLoader 統一加載

將配置文件、屬性文件、圖片等打入 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"));
  • 路徑為「包路徑 + 文件名」,與 JAR 內結構對應
  • 部署單一文件,消除「漏複製配置」故障
  • 適用於 Hibernate mapping、Spring context、i18n 資源等

Spring 應用特別提示

  • ClassPathXmlApplicationContext 依賴 Classpath 定位 applicationContext.xml,內嵌至 JAR 即可
  • 若需外部化配置,可結合 file: 前綴或 Spring Profiles
  • Fat Jar (Spring Boot) 將所有依賴解壓合併至單一 JAR,另闢蹊徑解決依賴地獄

總結:部署模式對比

模式優點缺點適用場景
標準 JAR + Class-Path透明、標準、易理解Class-Path 單行限制、路徑易斷中小型獨立應用
Fat Jar (Spring Boot)單文件部署、無依賴地獄體積大、啟動稍慢、資源加載需特殊處理微服務、容器化部署
擴展目錄共享節省磁碟、統一版本版本衝突、污染全局環境受控內部環境、插件架構

掌握 JAR 規範細節,能讓部署從「複製一堆文件」進化為「單一文件/單條命令」的專業體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved