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

Tomcat 啟動報 UnsupportedClassVersionError: Bad version number 完整排查指南

     編輯:Java 相關知識

錯誤核心含義

java.lang.UnsupportedClassVersionError: Bad version number in .class file
(unable to load class org.shirdrn.action.FilterAction)

直接原因: .class 檔案的 Major Version 高於當前 JVM 支援的最高版本。即:編譯時 JDK 版本 > 執行時 JDK 版本。

Class File 版本對照表

Major VersionJDK 版本十六進位
45JDK 1.10x2D
46JDK 1.20x2E
47JDK 1.30x2F
48JDK 1.40x30
49JDK 50x31
50JDK 60x32
51JDK 70x33
52JDK 80x34
53JDK 90x35
54JDK 100x36
55JDK 110x37
56JDK 120x38
57JDK 130x39
58JDK 140x3A
59JDK 150x3B
60JDK 160x3C
61JDK 170x3D
62JDK 180x3E
63JDK 190x3F
64JDK 200x40
65JDK 210x41

快速定位步驟

  1. 確認執行環境 JDK:
    java -version
    # 或在 Tomcat 啟動日誌首行查看
    # 例:Java HotSpot(TM) 64-Bit Server VM (build 25.312-b07, mixed mode) → JDK 8u312
  2. 檢查編譯輸出版本:
    javap -verbose target/classes/org/shirdrn/action/FilterAction.class | grep "major version"
    # 或 Linux/Mac:
    file target/classes/org/shirdrn/action/FilterAction.class
    # 輸出:compiled Java class data, version 52.0 (Java 8)
  3. 對比版本:若編譯版本 55 (JDK 11) > 執行版本 52 (JDK 8) → 直接報錯

四種解決方案(按推薦順序)

方案一:統一編譯目標版本(最佳實踐)

Maven 專案:

<properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.11.0</version>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
    <encoding>UTF-8</encoding>
    <release>8</release>  <!-- JDK 9+ 交叉編譯推薦 -->
  </configuration>
</plugin>

Gradle 專案:

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType(JavaCompile) {
    options.release = 8
}

方案二:升級 Tomcat 運行時 JDK

  • 安裝對應或更高版本 JDK
  • 修改 setenv.sh / setenv.bat:export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
  • 確認 catalina.sh 讀取正確 JAVA_HOME

方案三:MyEclipse / Eclipse 專案編譯器設定

  1. Project → Properties → Java Compiler:勾選 Enable project specific settings,Compiler compliance level 設 1.8
  2. Installed JREs:確認指向 JDK 8 (非 JRE),且 Execution Environments 映射正確
  3. 清理重建:Project → Clean → Clean all projects → Maven → Update Project → Force Update

方案四:多模組專案統一版本管理

在父 pom.xml 定義 pluginManagement 鎖定編譯器版本,子模組自動繼承:

<pluginManagement>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.11.0</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <release>8</release>
      </configuration>
    </plugin>
  </plugins>
</pluginManagement>

常見誤區與避坑指南

誤區真相
「我裝了 JDK 11,為什麼還是錯?」Tomcat 可能仍讀舊 JAVA_HOME 或 JRE_HOME,檢查啟動日誌首行
「專案設定 1.8 還是報錯」第三方依賴套件可能用更高版本編譯,需排除或升級運行時
「用 -target 1.8 就能在 JDK 8 跑 JDK 11 代碼」錯!若代碼使用 JDK 11 API (如 var, HttpClient),編譯會失敗或運行報 NoClassDefFoundError
「只改 Tomcat 版本就好」Tomcat 版本不決定 JVM 版本,核心在 JAVA_HOME

驗證腳本(Linux/Mac)

#!/bin/bash
echo "=== Runtime JVM ==="
java -version 2>&1 | head -1

echo -e "\n=== Compiled Class Versions ==="
find target -name "*.class" -exec javap -verbose {} \; 2>/dev/null | grep "major version" | sort -u

echo -e "\n=== Tomcat JAVA_HOME ==="
grep -E '^JAVA_HOME|^JRE_HOME' "$CATALINA_HOME/bin/setenv.sh" 2>/dev/null || echo "未設定 setenv.sh"

結語

UnsupportedClassVersionError 本質是「編譯版本 > 運行版本」。解決核心在於統一專案編譯目標版本與確保運行環境 JDK 版本足夠。建立團隊統一的 maven-compiler-plugin 配置規範,配合 CI/CD 檢查編譯版本,可從根源杜絕此類問題。

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