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

Struts2 啟動報 UnsupportedClassVersionError:版本號不支援的經典原因與解法

     編輯:程式設計綜合問答

Tomcat 啟動 Struts2 專案時拋出:

java.lang.UnsupportedClassVersionError: Bad version number in .class file
(unable to load class org.apache.commons.lang3.StringUtils)

這不是 Struts2 Bug,而是類別檔案版本與執行期 JVM 版本不匹配的鐵律報錯。

錯誤核心含義

規則:Major Version 必須 ≤ 運行時 JVM 支援的最大版本。高版本編譯的 class 無法在低版本 JVM 跑,反之可行。

本案例分析

  • 錯誤提到 org.apache.commons.lang3.StringUtils
  • 該類屬於 commons-lang3-3.x.jar,3.7+ 版本要求 JDK 8+ 編譯(Major 52)
  • 若生產環境 Tomcat 用 JDK 7 (JRE 7) 啟動 → 直接報此錯

三種解決路徑

1. 升級運行時 JDK(推薦)

  • 生產環境 Tomcat 改用 JDK 8/11/17(視專案相容性)
  • 修改 setenv.sh/bat 的 JAVA_HOME 指向新 JDK

2. 降級依賴庫版本(不升級 JDK 時)

  • commons-lang3 降至 3.6(最後支援 JDK 7 的版本)
  • Maven:<version>3.6</version>
  • 同理檢查其他依賴:log4j2、jackson 等新版多要求 JDK 8+

3. 交叉編譯(開發環境 JDK 高、部署環境 JDK 低)

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.7</source>
    <target>1.7</target>
    <release>7</release> <!-- JDK 9+ 交叉編譯建議用 release -->
  </configuration>
</plugin>

快速診斷指令

# 查看 class 文件版本
javap -verbose YourClass.class | grep "major version"

# 或用十六進制編輯器看第 6-7 字節
# 0x0034 = 52 = JDK 8

最佳實務:統一工具鏈版本

  • 專案根目錄建立 .java-version 或 .sdkmanrc 鎖定版本
  • CI/CD 管線強制使用相同 JDK 建置與部署
  • 依賴升級時檢閱 Release Notes 中的 Minimum Java Version

總結

UnsupportedClassVersionError 純粹是編譯版本 > 運行版本。要么升級運行時 JDK,要么降級依賴/交叉編譯。建立版本治理機制,讓此類低級錯誤永不再現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類別檔案版本 (Major Version)對應 JDK 編譯版本最低執行 JVM 版本
45JDK 1.11.1
46JDK 1.21.2
47JDK 1.31.3
48JDK 1.41.4
49JDK 55
50JDK 66
51JDK 77
52JDK 88
55JDK 1111
61JDK 1717
65JDK 2121