首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JAR 包運行「找不到主類」終極排查清單

     編輯:程式設計綜合問答

現象

> java -jar gg2.jar
錯誤: 找不到或無法加載主類 DrawPlumBlossomFrame

五大核心原因及修復

#原因驗證方法修復
1Manifest 中 Main-Class 寫錯/類不在包根jar tf gg2.jar | grep DrawPlumBlossomFrame 應輸出 DrawPlumBlossomFrame.class(無包目前綴)確保類在默認包,或 Manifest 寫全限定名 com.xxx.DrawPlumBlossomFrame 並放入對應目錄
2Manifest 格式錯誤(缺換行、編碼)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類文件編譯版本高於運行 JREjavap -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

標準化打包流程(Maven 推薦)

<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 容易漏掉目錄結構。

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