使用 Eclipse 導出 Runnable JAR 時,若報 no main manifest attribute 或 NoClassDefFoundError,根因在於 META-INF/MANIFEST.MF 缺少關鍵屬性。
編輯 MANIFEST.MF,添加:
Main-Class: com.example.MainClass
關鍵規則:
Main-Class: 後必須有一個空格,否則解析失敗。.class 或 .java 後綴。當專案依賴外部庫(如 activemq-all-5.12.1.jar)時,需配置:
Class-Path: lib/activemq-all-5.12.1.jar
部署結構要求:
部署目錄/
├── myapp.jar
└── lib/
└── activemq-all-5.12.1.jar
Class-Path 路徑為相對於 JAR 所在目錄的相對路徑。Class-Path: lib/a.jar lib/b.jarManifest-Version: 1.0
Main-Class: com.example.MainClass
Class-Path: lib/activemq-all-5.12.1.jar lib/slf4j-api-1.7.25.jar
# 1. 編譯
javac -d out -cp "lib/*" src/com/example/*.java
# 2. 建立 MANIFEST.MF
echo "Main-Class: com.example.MainClass" > manifest.txt
echo "Class-Path: lib/activemq-all-5.12.1.jar" >> manifest.txt
echo "" >> manifest.txt # 關鍵:結尾換行
# 3. 打包
jar cfm myapp.jar manifest.txt -C out .
# 4. 執行
java -jar myapp.jar
| 錯誤現象 | 原因 | 解決 |
|---|---|---|
| no main manifest attribute | 缺少 Main-Class 或格式錯誤 | 檢查冒號後空格、結尾換行 |
| NoClassDefFoundError | 缺少 Class-Path 或庫路徑錯誤 | 確認 lib 目錄存在、路徑相對正確 |
| ClassNotFoundException | 依賴傳遞性缺失 | 將所有傳遞依賴加入 Class-Path |