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) | 對應 JDK 編譯版本 | 最低執行 JVM 版本 |
| 45 | JDK 1.1 | 1.1 |
| 46 | JDK 1.2 | 1.2 |
| 47 | JDK 1.3 | 1.3 |
| 48 | JDK 1.4 | 1.4 |
| 49 | JDK 5 | 5 |
| 50 | JDK 6 | 6 |
| 51 | JDK 7 | 7 |
| 52 | JDK 8 | 8 |
| 55 | JDK 11 | 11 |
| 61 | JDK 17 | 17 |
| 65 | JDK 21 | 21 |
規則: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,要么降級依賴/交叉編譯。建立版本治理機制,讓此類低級錯誤永不再現。
- 上一篇文章: Eclipse 啟動報錯「找不到 JRE/JDK」?環境變數配置全攻略
- 下一篇文章: PyMongo find() 返回 Cursor 而非列表?正確遍歷與資料取回姿勢
Copyright ©
程式碼之家 All Rights Reserved