java.lang.UnsupportedClassVersionError


今天在練習“第33章 讓軟件具有更好的擴展性”的33.2小結時,把myplugin插件安裝到RCP項目后,就出現了“java.lang.UnsupportedClassVersionError”的錯誤

(1)

用高版本jdk編譯好的class無法在低版本JVM上運行導致的。這一問題在jdk1.5和更早版本這兩者之間尤其明顯。
別說,我真的是裝了1.42和1.5兩個版本的jdk。
解決辦法:以IDE使用Eclipse為例,打開菜單 Windows -> Preferences -> Java -> Compiler, 在JDK compiliance里面compiler compiliance level一項改成和機器正在用的JVM同樣版本,我的情況是從1.5改成1.4。
另外,如果之前對某個project單獨設置過build path或者compile設置,最好改完上面的也單獨看一下那個project的設置是否一起變過來了。我的情況就是沒變過來還要專門改一次。

(2)

出現 java.lang.UnsupportedClassVersionError 錯誤的原因,是因為我們使用高版本的 JDK 編譯的 Java class 文件試圖在較低版本的 JVM 上運行,所報的錯誤。
因為,高版本的 JDK 生成的 class 文件使用的格式,可能與低版本的 JDK 的 .class 文件格式不同。這樣,低版本的 JVM 無法解釋執行這個 .class 文件,會拋出 java.lang.UnsupportedClassVersionError 不支持的 Class 版本錯誤。
這個錯誤尤其在 JDK5 與 JDK5 之前的版本上表現明顯。因為, JDK5 在 Java 語法上作了不少增強,引入了一些新的 .class 文件的元素,導致舊版本的 JVM 無法解釋、執行 .class 文件。即使這個類並沒有使用任何 JDK5 的新元素,但是 JDK5 生成的 .class 文件, JDK1.4 及其以前的 JVM 都無法辨認!
所以,目前使用最廣的,還是 JDK1.4 。很多軟件和項目都無法使用 JDK5 。
有一個名叫 Toby Reyelts 的開發人員決定消除 JDK 5.0 編譯器限制。結果就是開放源代碼的 Retroweaver 項目(參見 參考資料 )。 Retroweaver 使用 classworking 技術來修改由 JDK 5.0 編譯器生成的二進制類表示,以便這些類可以與早期的 JVM 一起使用。
它通過修改 JDK5 生成的 .class 文件,將其變為 JVM1.4 及之前版本能夠運行的 .class 文件。
目前,使用新版本的 IDE 編輯器可能會造成你遭遇 java.lang.UnsupportedClassVersionError 錯誤。
比如, Eclipse3.2+MyEclipse5.0 這個新版的 IDE 工具。進入首選項 ---Java--- 編譯器,可以看到,默認的編譯器依從等級是 5.0, 這里改為 1.4 ,因為我們使用的軟件需要運行在 JDK1.4 的 JVM 上。
同一配置區下的已安裝 JRE 中,不要安裝 JRE ,而是安裝 JDK ,指定 1.4 或 1.5 的 JDK 。還是使用 jdk1.4 。
在 MyEclipse---- 應用服務器下,指定 Tomcat5 。指定 Tomcat 使用 jdk1.4 。
這樣,就全部指定使用 Jdk1.4 來編譯和運行程序了。如果全部指定 jdk5 也是可以的。但是,絕對不能夠使用 jdk5 編譯程序,而又在 jdk1.4 上運行程序,那樣將會拋出 java.lang.UnsupportedClassVersionError 不支持的 Class 版本錯誤。
這種情況下,不論是 Eclipse 生成的 war 包,還是 ant 文件生成 war 包,都使用 jdk5 編譯,就會在運行時出現錯誤,該應用程序將無法啟動。如果你查看 Tomcat 的日志文件,將會看到正是 java.lang.UnsupportedClassVersionError 錯誤發生了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM