天天看點

錯誤的類檔案:… 類檔案具有錯誤的版本 52.0,應為 50.0

出現問題:

今天在pom.xml中引入了最新版本guava工具包,編譯時報了如下錯誤:

[ERROR] E:\workspace\report\src\main\java\indi\johnny\report\template\excel\ExcelXSSFStyle.java:[16,-1] 無法通路 com.google.common.base.Strings

錯誤的類檔案: com\google\common\base\Strings.class(com\google\common\base:Strings.class)

類檔案具有錯誤的版本 52.0,應為 50.0

如圖:

錯誤的類檔案:… 類檔案具有錯誤的版本 52.0,應為 50.0

圖1

概念引進:

      major.minor 版本号:每個版本的 JDK 編譯器編譯出的 class 檔案中都帶有一個版本号。

      上面截圖中出現的52.0 50.0 就是我們所說的major版本号。

問題排查:

将出現問題的guava-21.0.jar 通過[ jar –xvf  guava-21.0.jar ]解壓後,進入目錄,找到報出異常的類"Strings"

錯誤的類檔案:… 類檔案具有錯誤的版本 52.0,應為 50.0

圖2

通過找到報出異常的類"Strings" ,使用 指令:[  javap -verbose Strings ]  ,能顯示出類的 major.minor 版本,major版本确實為52。

錯誤的類檔案:… 類檔案具有錯誤的版本 52.0,應為 50.0

圖3

解決方案:

降低guava的版本,如下圖所示,将版本21.0換成19.0:

錯誤的類檔案:… 類檔案具有錯誤的版本 52.0,應為 50.0

圖4

再次編譯項目,則編譯成功。

解壓 guava-19.0.jar後,找到報出異常的類"Strings" ,使用 指令:[  javap -verbose Strings ]  ,能顯示出類的 major.minor 版本,為50。

錯誤的類檔案:… 類檔案具有錯誤的版本 52.0,應為 50.0

圖5

jdk版本與major版本對應的關系如下,參考部落格:http://smilejay.com/2014/02/java-unsupported-major-minor-version-51-0/

錯誤的類檔案:… 類檔案具有錯誤的版本 52.0,應為 50.0

圖6

我本地的jdk版本為1.6(等同6.0),對應的major版本為50,是以異常提示的資訊為 "應為 50.0"

檢視guava-21.0.jar解壓後目錄META-INF下的檔案MANIFEST.MF,如圖所示,jdk編譯版本為1.8:

錯誤的類檔案:… 類檔案具有錯誤的版本 52.0,應為 50.0

圖7

但是檢視guava-19.0.jar解壓後目錄META-INF下的檔案MANIFEST.MF,如圖所示,jdk編譯版本不是1.6,而是1.7:

錯誤的類檔案:… 類檔案具有錯誤的版本 52.0,應為 50.0

圖8

個人了解:class檔案加載至jvm并不是完全按照圖6一 一對應的關系,而是按照major.minor版本号範圍來加載至JVM,超出範圍則要出錯。

本地1.6的環境能夠識别并運作1.7編譯的guava-19.0.jar包,是因為guava-19.0.jar中的"Strings"類的major版本号為50。

參考部落格:http://sheng.iteye.com/blog/690035

結論:加載至jvm中的class檔案,class檔案的major版本号必須等于或小于目前jvm環境要求的最大major版本号。

通俗講:假設Student.class的major版本号為50,既可以放在1.6的jvm中運作,也可以放在1.8的jvm中運作。若Student.class的major版本号為52,則隻能在1.8或更高版本的jvm中運作。

歡迎拍磚!