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

產生可雙擊執行的 JAR 檔案完整步驟

     編輯:Java 程式設計入門

要讓 JAR 檔案支援雙點擊執行,必須在資訊清單中指定主類別,並確保 JAR 關聯正確的 Java 執行環境。以下為標準步驟與常見陷阱。

1. 建立 Manifest 檔案

建立純文字檔 manifest.mf (或 .mf/.mft),內容如下:

Main-Class: com.example.MainClass
Class-Path: lib/dependency1.jar lib/dependency2.jar

關鍵規則:

  • Main-Class: 後必須有一個空格,接著完整類別名稱 (含套件名)。
  • 最後一行必須以換行符結尾 (CR/LF),否則 JVM 可能無法讀取該屬性。
  • 若有外部依賴 JAR,使用 Class-Path: 列出相對路徑 (空格分隔),路徑相對於 JAR 所在目錄。
  • 檔案編碼建議 UTF-8。

2. 打包 JAR 指令

# 基本語法: jar cvfm   <輸入檔案...>
jar cvfm MyApp.jar manifest.mf -C bin/ .  # 從 bin/ 目錄打包所有類別與資源
# 或指定具體檔案
jar cvfm MyApp.jar manifest.mf com/example/*.class resources/*.properties

參數說明:

  • c:建立新檔案
  • v:顯示詳細過程
  • f:指定輸出檔名
  • m:引入自訂 Manifest

3. 常見打包範例

指令說明
jar cvfm app.jar manifest.mf *.class目前目錄所有 .class 檔
jar cvfm app.jar manifest.mf *.class *.java包含原始碼 (可選)
jar cvfm app.jar manifest.mf *.*目前目錄所有有副檔名的檔案
jar cvfm app.jar manifest.mf *目前目錄所有檔案 (含無副檔名)
jar cvfm app.jar manifest.mf -C build/classes .從 build/classes 目錄遞迴打包 (推薦)

4. 驗證與執行

# 檢查 Manifest 內容
jar tf app.jar META-INF/MANIFEST.MF
# 或直接解壓查看

# 執行
java -jar app.jar
# 雙擊執行需作業系統已關聯 .jar -> javaw.exe (Windows) / java (Linux/Mac)

5. 進階:Maven/Gradle 自動化

Maven (pom.xml):


  
    
      org.apache.maven.plugins
      maven-jar-plugin
      3.4.2
      
        
          
            com.example.MainClass
            true
            lib/
          
          
            ${maven.build.timestamp}
          
        
      
    
    
      org.apache.maven.plugins
      maven-dependency-plugin
      3.6.0
      
        
          copy-dependencies
          package
          copy-dependencies
          
            ${project.build.directory}/lib
          
        
      
    
  

執行 mvn clean package 產生 target/app.jar 並自動複製依賴至 target/lib/。

Gradle (build.gradle):

plugins { id 'application' }
application { mainClass = 'com.example.MainClass' }
tasks.named('jar') {
    manifest {
        attributes 'Main-Class': 'com.example.MainClass',
                   'Class-Path': configurations.runtimeClasspath.files.collect { "lib/$it.name" }.join(' ')
    }
}
tasks.register('copyLibs', Copy) {
    from configurations.runtimeClasspath
    into 'build/libs/lib'
}
tasks.named('build').configure { dependsOn 'copyLibs' }

6. 常見問題排查

現象可能原因解決方法
雙擊無反應.jar 未關聯 javaw.exeWindows: assoc .jar=jarfile ftype jarfile="C:\Path\javaw.exe" -jar "%1" %*
找不到主類別Manifest 缺少 Main-Class 或格式錯誤檢查 jar tf app.jar META-INF/MANIFEST.MF,確認有空格與換行
ClassNotFoundException (依賴)Class-Path 路徑錯誤或依賴未複製使用 Maven/Gradle 自動管理,或手動建立 lib/ 目錄放置依賴
載入資源檔失敗使用 File 而非 ClassLoader 讀取改用 getClass().getResourceAsStream("/config.properties")

7. 模組化專案 (Java 9+ JPMS)

若專案使用 module-info.java,打包為模組化 JAR:

jar --create --file app.jar --main-class com.example.MainClass -C mods/com.example .

執行時需指定模組路徑:

java --module-path libs --module com.example/com.example.MainClass

或打包為模組化執行映像 (jlink) 產生不需 JRE 的原生啟動器。

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