在一次專案打包中遇到了這個問題,這個問題的本質是打包時,你依賴的包或這些依賴的間接依賴中含有高於當前專案構建jdk版本編譯出來的類,導致打包失敗。
1.major version和jdk各版本對應關係可以自行搜尋,當前主要版本的對應關係是
c:55 對應 java 11
major version:52 對應 java 8
major version:51 對應 java 7
major version:50 對應 java 6
jar -xvf
解壓依賴的jar包,然後對某個class檔案執行javap -verbose xxx.class |grep version
檢視某個類的版本,比如我的專案構建是jdk8,找個某個類A,其major version是55,那基本就確定是因為這個類引起的了。
2.那麼關鍵是怎麼定位是哪個依賴包含了這個類呢
我這裡使用gradle構建執行shadowJar時,嘗試開啟了各種debug和trace日誌,並未提示具體是處理哪個類過程中報的錯,就只能用笨辦法,看看構建成功和失敗之間的改動是哪些,一個個exclude進行判斷(exclude的過程中必須要把間接依賴也考慮進去)。
經過我的一番排查,最終確定是com.fasterxml.jackson.core:jackson-core:2.15.2
中的META-INF/versions下的類引起的,打包時exclude這些檔案後構建成功!這個依賴其實也是別的包間接引進的,所以排查起來還是比較費勁!
shadowJar {
// ...
// 其餘內容省略
mergeServiceFiles()
exclude "META-INF/versions/**/*.*"
}