出現問題:
今天在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
如圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO3MzM0gzM2YTMtQTMyEjM3QDOxMDMyAzNxAjMtcjM5gTM28CXyAzNxAjMvw1NykDOxYzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
圖1
概念引進:
major.minor 版本号:每個版本的 JDK 編譯器編譯出的 class 檔案中都帶有一個版本号。
上面截圖中出現的52.0 50.0 就是我們所說的major版本号。
問題排查:
将出現問題的guava-21.0.jar 通過[ jar –xvf guava-21.0.jar ]解壓後,進入目錄,找到報出異常的類"Strings"
圖2
通過找到報出異常的類"Strings" ,使用 指令:[ javap -verbose Strings ] ,能顯示出類的 major.minor 版本,major版本确實為52。
圖3
解決方案:
降低guava的版本,如下圖所示,将版本21.0換成19.0:
圖4
再次編譯項目,則編譯成功。
解壓 guava-19.0.jar後,找到報出異常的類"Strings" ,使用 指令:[ javap -verbose Strings ] ,能顯示出類的 major.minor 版本,為50。
圖5
jdk版本與major版本對應的關系如下,參考部落格:http://smilejay.com/2014/02/java-unsupported-major-minor-version-51-0/
圖6
我本地的jdk版本為1.6(等同6.0),對應的major版本為50,是以異常提示的資訊為 "應為 50.0"
檢視guava-21.0.jar解壓後目錄META-INF下的檔案MANIFEST.MF,如圖所示,jdk編譯版本為1.8:
圖7
但是檢視guava-19.0.jar解壓後目錄META-INF下的檔案MANIFEST.MF,如圖所示,jdk編譯版本不是1.6,而是1.7:
圖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中運作。
歡迎拍磚!