Unsupported major.minor version 49.0 錯誤的核心原因是:JDK 1.5 編譯的類別檔(版本 49.0)無法在 JVM 1.4 或更低版本執行。Java 類別檔開頭的 major.minor version 標識了編譯版本,JVM 只能載入版本號在其支援範圍內的類別檔。
類別檔第 5-8 位元組儲存 minor_version 與 major_version。以 JDK 1.5 編譯的 HelloWorld.class 為例,十六進位 0x0031 轉十進位為 49,故版本為 49.0。各 JDK 版本對應表:
major/minor versionMETA-INF/MANIFEST.MF 的 Build-Jdk 或 Created-By 欄位最可靠的是 javap -verbose 直接檢視位元碼,不受封裝後修改影響。
繼續使用高版本 JDK,編譯時加入參數:
javac -target 1.4 -source 1.4 YourClass.java
Ant 建構:
<javac target="1.4" source="1.4" ... />
Eclipse:專案屬性 → Java Compiler → 設定 Compiler compliance level、Generated class files compatibility、Source compatibility。
若程式碼使用了 JDK 1.5+ 新特性(泛型、自動裝箱、枚舉等),無法用 -source 1.4 編譯。此時可用 Retrotranslator 將已編譯的 1.5 位元碼轉為 1.4 相容版本,保留新特性語法優勢。
確認目標 JVM 版本(java -version 或 System.getProperty("java.class.version")),確保編譯目標版本不超過執行環境支援上限。
將 JDK 1.5 環境下安裝的 Tomcat 整個目錄複製到 JDK 1.4 機器,JSP 編譯報 49.0 錯誤。原因:%TOMCAT_HOME%\common\lib\tools.jar 是安裝時從 JDK 1.5 複製來的,JSP 編譯器用的是 1.4 JVM 載入 49.0 版本的 tools.jar。解決:換上 JDK 1.4 的 tools.jar。
| JDK 編譯器 | 預設 target | major.minor (十進位) |
|---|---|---|
| 1.4 | 1.2 | 46.0 |
| 1.5 | 1.5 | 49.0 |
| 1.6 | 1.6 | 50.0 |
| 1.7 | 1.6 | 50.0 |
| 1.8 | 1.8 | 52.0 |
major.minor 版本機制如同 32 位程式無法在 16 位系統執行。開發前確認目標 JVM 版本、善用 -target/-source 參數或 Retrotranslator,即可從根源避免版本衝突。