轉自(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 文件處理一下就行了。