1. 程式人生 > 其它 >lamda表示式導致執行時VerifyError

lamda表示式導致執行時VerifyError

  最近在做一個遠端專案,應用在本地idea和遠端同事的idea中能夠跑起來,但是同事那邊使用Jenkins打包部署到伺服器之後,啟動報錯,日誌報錯資訊如下圖所示:   這個報錯是類載入時的校驗階段出錯,和位元組碼有關,不過既然本地能夠啟動,很自然的覺得應該是JDK版本有差異,從而導致位元組碼不相容。查看了JDK版本,我自己和同事的版本分別是1.8.0_181與1.8.0_271,而伺服器上面是1.8.0_101版本。   由於伺服器版本無法改變,那麼只能尋找修改程式碼的方法了,又仔細看了一下錯誤資訊,發現了invokedynamic與lamda這兩個關鍵字,lamda表示式是JDK8加入的語法糖,執行時通過invokedynamic指令實現功能,所以將程式碼中的lamda表示式進行修改,換成了不使用lamda的實現,重新打包之後,放在伺服器上成功執行。   備註:解決問題的過程實際麻煩得多,經過了一系列的心路歷程: (1)最開始懷疑JDK版本問題,覺得伺服器上可能使用的是OpenJDK,經過檢視之後,發現伺服器上用的也是OracleJDK。 (2)驗證了伺服器上用的不是OpenJDK之後,我開始懷疑是lamda表示式的問題,這個判斷基於在《深入理解Java虛擬機器》一書中學到的知識,以及腦子裡面隱隱約約記得看到過1.8的lamda表示式導致其它BUG部落格,為了確認這一點,我開始在baidu上搜索。 (3)很遺憾,搜尋關鍵字不精確(只使用了"bad type on operand stack")讓我走了很大的彎路,很多人說這個錯誤產生的原因是依賴的庫版本不對,剛好我這個專案也有一個公共common包的依賴問題,由於是遠端開發,自己搭建環境的時候選擇的common包版本和對方使用的版本不一樣,所以在這一步嘗試了很多方法,也都沒有解決。 (4)最後還是回到lamda表示式,在StackOverflow上搜索到幾篇關於lamda與VerifyError的提問(連結在下面),於是我選擇了將程式碼修改為非lamda表示式的實現,問題解決。