> java -jar gg2.jar
錯誤: 找不到或無法加載主類 DrawPlumBlossomFrame
| # | 原因 | 驗證方法 | 修復 |
|---|---|---|---|
| 1 | Manifest 中 Main-Class 寫錯/類不在包根 | jar tf gg2.jar | grep DrawPlumBlossomFrame 應輸出 DrawPlumBlossomFrame.class(無包目前綴) | 確保類在默認包,或 Manifest 寫全限定名 com.xxx.DrawPlumBlossomFrame 並放入對應目錄 |
| 2 | Manifest 格式錯誤(缺換行、編碼) | jar xf gg2.jar META-INF/MANIFEST.MF && cat MANIFEST.MF 檢查末尾有空行,UTF-8 無 BOM | 重建 Manifest,保證 Main-Class: DrawPlumBlossomFrame 後有換行 |
| 3 | 依賴第三方 JAR 未打入(Class-Path 缺失) | 報 NoClassDefFoundError 而非主類錯誤,但易混淆 | 使用 Maven Shade Plugin 或 Gradle ShadowJar 生成 Fat JAR |
| 4 | 類文件編譯版本高於運行 JRE | javap -verbose DrawPlumBlossomFrame.class | grep major 對照 java -version | 編譯目標版本 -target 1.8 或升級 JRE |
| 5 | 打包命令錯誤未包含類文件 | jar tf gg2.jar 確認 .class 存在 | 正確打包:jar cvfe gg2.jar DrawPlumBlossomFrame DrawPlumBlossomFrame.class 或 jar cvfm gg2.jar manifest.mf *.class |
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>DrawPlumBlossomFrame</mainClass>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
執行 mvn clean package 產出 target/xxx-shaded.jar,直接 java -jar 即可。
#!/bin/bash
JAR=$1
echo "=== Manifest ==="; unzip -qc $JAR META-INF/MANIFEST.MF
echo -e "\n=== Class files ==="; unzip -l $JAR | grep '\.class$' | head -20
echo -e "\n=== Run test ==="; java -jar $JAR
90% 的「找不到主類」是 Manifest 路徑與實際類文件路徑不匹配。用 Maven Shade Plugin 一勞永逸,手動
jar cvfm容易漏掉目錄結構。