升級到JDK8,編譯時發生 Error:java: java.lang.ExceptionInInitializerError


編譯的時候出現這個問題。使用1.7的jdk沒問題,但是由於po主的項目中,使用了java8編寫的代碼,解決java8兼容問題成為解決這個問題的首選方案。

這個日志太過簡單,只告知一個異常信息,這個異常發生的原因主要是由於靜態類,靜態變量初始化時發生了異常,po的項目是個很早的項目,靜態類太多,無法直接定位異常信息到底是如何產生,控制台也沒有輸出堆棧,這給排查問題帶來了極大的不便,第一個要解決的應該就是講詳細的堆棧信息輸出,能方便的定位到問題的根源。

注意到第三條Infomation,Compliation completed with 1 error..... 這說明,異常產生時是在編譯階段,先去看看Idea的build的日志。日志的目錄在 

/Users/xxxx/Library/Logs/IdeaIC2016.1/build-log

打開bulid.log,可以看到具體的異常的堆棧信息。

 

從堆棧的信息來看,lombok.javac.Javac.getCtcInt 應該是出現了版本兼容的問題。找下萬能的google后

https://intellij-support.jetbrains.com/hc/en-us/community/posts/205434150-IDEA-2016-3-compile-error-please-help-

這個同學發生了相同的問題,檢查了下我的IDEA的版本,這位同學的IDEA版本是 2016.3。po下我的:

IntelliJ IDEA 2016.1.1

Build #IC-145.597, built on March 29, 2016
JRE: 1.8.0_40-release-b132 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

版本還比較這位同學的要舊一些,所以!先升級一下IDEA吧!升級去了,待會來po是不是已經解決!

+++++++++++++++++++++++++我是華麗的分割線++++++++++++++++++++

 

 IDEA升級完成后,發現編譯依然還是有問題,發生同樣的錯誤,那位同學發生的那個問題其實更偏重於IDEA默認選擇了jdk1.8來編譯,所以想解決怎么回去到 1.7,而並沒有解決掉1.8與lombok的某些版本不兼容的問題。

於是不得不從原理上先去了解下lombok。

lombok是什么?

簡單的一句話說,lombok是個編譯期的注解工具,注解的主要的目的就是為了能少寫一些枯燥的java代碼,比如getter,setter之類的。使用lombok就能在編譯期間,將你使用注解標注生成代碼已完成編譯過程。

詳情:https://projectlombok.org/

從異常上看,這個有點像版本不匹配造成的,NoSuchFiled,應該是版本太低的原因。於是我腦殘的覺得,是IDEA的lombok的插件的問題造成的,升級了一下lombok的Idea的插件,問題依舊!

這個項目不是我的,對依賴並不了解。既然不是插件的問題,如果項目中需要使用lombok的注解,那項目一定需要依賴lombok。

mvn dependency:tree 打出依賴樹,果真,在項目中有使用lombok的0.12的一個版本的依賴。

實在是納悶,這種包應該是在編譯期間使用呀,為啥會被二方包依賴進來,scope應該是provided。

於是將 lombok的包Exclusion掉。世界瞬間變美好起來!

 

我來總結一下:在JDK1.7的環境下,lombok的 0.12的版本並不存在問題。編譯沒啥問題。升級到JDK8之后,lombok的0.12版本不兼容,於是出現了編譯器的錯誤。這個時候你需要升級你的lombok的版本,如果你使用的是maven生命周期管理工具,記得把scope設置成 provider,發布二方包的同學,這種包就不要打進二方包里面了。

 

原文地址:https://www.cnblogs.com/zhoukedou/p/7007972.html


免責聲明!

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



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