unsupported major.minor version 解決方法

轉自(http://hi.baidu.com/fatchong/blog/item/191da23b478bbfef15cecbae.html

編譯。java文件的時候出現 “unsupported major.minor version50.0”,之前是沒有出現這個問題,查找jdk,都是在1.6下編譯的,後來在網絡上看到這篇文章

感覺一旦遇到這個問題,解決的方法還是不錯的。我的問題是是因爲之前我安裝了oracle客戶端導致的環境變量改變導致,直接把path的jdk變量放到前面即可。

總結下:

         出現unsupported major.minor version x.x

       大致是1.系統的環境變量的改變

   2.jdk的版本問題引起的

一直以來都是用jdk1.5,這次重返電信由於其系統是在jdk1.4上編譯的,編譯的時候出現了unsupported major.minor version49.0的錯誤,上網查看了一下還是一個很普遍的錯誤,搗鼓了兩天終於搗鼓出一些東西,現分享給大家。

     何謂 major.minor,且又居身於何處呢?先感性認識並找到 major.minor 來。順便寫一段 代碼,然後用 JDK 1.5 的編譯器編譯成class,用UltraEdit或者其他能打開非十進制文件的軟件打開此class,見下圖:

        

       從上圖中我們看出來了什麼是 major.minor version 了,它相當於一個軟件的主次版本號,只是在這裏是標識的一個 Java Class 的主版本號和次版本號,同時我們看到 minor_version 爲 0x0000,major_version 爲 0x0031,轉換爲十制數分別爲0 和 49,即 major.minor 就是 49.0 了。

      現在不妨從 JDK 1.1 到 JDK 1.7 編譯器編譯出的 class 的默認 minor.major version 吧。(又走到 Sun 的網站上翻騰出我從來都沒用過的古董來)
     

JDK 編譯器版本 target 參數 十六進制 minor.major 十進制 minor.major
jdk1.1.8 不能帶 target 參數 00 03 00 2D 45.3
jdk1.2.2 不帶(默認爲 -target 1.1) 00 03 00 2D 45.3
jdk1.2.2 -target 1.2 00 00   00 2E 46.0
jdk1.3.1_19 不帶(默認爲 -target 1.1) 00 03 00 2D 45.3
jdk1.3.1_19 -target 1.3 00 00   00 2F 47.0
j2sdk1.4.2_10 不帶(默認爲 -target 1.2) 00 00   00 2E 46.0
j2sdk1.4.2_10 -target 1.4 00 00   00 30 48.0
jdk1.5.0_11 不帶(默認爲 -target 1.5) 00 00   00 31 49.0
jdk1.5.0_11 -target 1.4 -source 1.4 00 00   00 30 48.0
jdk1.6.0_01 不帶(默認爲 -target 1.6) 00 00   00 32 50.0
jdk1.6.0_01 -target 1.5 00 00   00 31 49.0
jdk1.6.0_01 -target 1.4 -source 1.4 00 00   00 30 48.0
jdk1.7.0 不帶(默認爲 -target 1.6) 00 00   00 32 50.0
jdk1.7.0 -target 1.7 00 00   00 33 51.0
jdk1.7.0 -target 1.4 -source 1.4 00 00   00 30 48.0
Apache Harmony 5.0M3 不帶(默認爲 -target 1.2) 00 00   00 2E 46.0
Apache Harmony 5.0M3 -target 1.4 00 00   00 30 48.0

       當然你也可以用其他方法查看版本號,比如javap -verbose XXXX(class名)。

        那麼現在如果碰到這種問題該知道如何解決了吧,還會像我所見到有些兄弟那樣,去找個 1.4 的 JDK 下載安裝,然後用其重新編譯所有的代碼嗎?且不說這種方法的繁瑣,而且web應用程序還不一定能成功,其實大可不必如此費神,我們一定還記得 javac 還有個 -target 參數,對啦,可以繼續使用 1.5 JDK,編譯時帶上參數 -target 1.4 -source 1.4 就 OK 啦,不過你一定要對哪些 API 是 1.5 JDK 加入進來的瞭如指掌,不能你的 class 文件拿到 JVM 1.4 下就會 method not found。目標 JVM 是 1.3 的話,編譯選項就用 -target 1.3 -source 1.3 了。

      相應的如果使用 ant ,它的 javac 任務也可對應的選擇 target 和 source

<javac target="1.4" source="1.4" ............................/>

如果是在開發中,可以肯定的是現在真正算得上是 JAVA IDE 對於工程也都有編譯選項設置目標代碼的。例如 Eclipse 的項目屬性中的 Java Compiler 設置,如圖:

        

        其實理解 major.minor 就像是我們可以這麼想像,同樣是微軟件的程序,32 位的應用程序不能拿到 16 位系統中執行那樣。

如果我們發佈前瞭解到目標 JVM 版本,知道怎麼從 java class 文件中看出 major.minor 版本來,就不用等到服務器報出異常才着手去解決,也就能預知到可能發生的問題。

其他時候遇到這個問題應具體解決,總之問題的根由是低版本的 JVM 無法加載高版本的 class 文件造成的,找到高版本的 class 文件處理一下就行了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章