idea 模組jdk依賴總是自動變_Maven子模組間依賴傳遞導致元件版本降級問題
技術標籤:idea 模組jdk依賴總是自動變
將專案分為了子父子模組專案後,遇到了不少問題,還是原來單模組管理簡單,但是為了專案將來能夠隨引用的腳手架升級而升級,還是將專案改為父子模組結構,並且儘量不修改引用腳手架的結構,將自己的應用都新增到兩個新模組中。再改造後,遇到最莫名其妙的一個問題就是間接依賴引用的一個包自動降級,導致系統出問題,研究了好久才搞明白怎麼回事,沒有找到根本的解決方法,通過複雜的排除臨時解決了問題,特此記錄一下。
一、問題介紹
修改後的模組Root是根模組,組織其它模組,A、B、C是原有的模組,自己新加了兩個模組一個是基礎內容模組Q、一個是WEB及功能模組T,A模組是APP所在元件,A依賴B、C、Q和T。
在T模組中,有訊飛語音元件,該元件需要需要okhttp元件,如下所示,該元件又依賴了okio和lotlin-stdlib兩個元件,在查詢這三個元件內容和原來的單模組元件下,kotlin-stdlib都是1.3.70版本,但是轉換為多模組無論如何修改,kotlin-stdlib都是1.2.71版本,不會更新。程式在執行時,會先找到1.2.71的包,由於1.2.71版本預設copyInto方法,會報下面錯誤。
NoSuchMethodError: kotlin.collections.ArraysKt.copyInto
二、問題原因分析
通過與原來的單模組反覆對比,也試過各種版本調整,問題仍不能解決,kotlin-stdlib效有效版本總是1.2.71.
開啟模組T的pom檔案,檢視結構,檢查衝突會出現以下內容,明確出衝突:
打、開專案檔案樹的A模組的iml檔案發現有stdlib1.2.71內容,通過關係查詢,發現是A依賴T,通過T模組引用而來,但是版本總是1.2.71,通過okhttp 4.7.2檔案對應,應該是1.3.71才對,但是idea不知為何,引進的總是1.2.71,導致系統問題。
檢視,專案External Libraries,如下圖,是舊版本。
三、解決方法
發現這個問題原因後,先做了以下幾面嘗試,
1、排除kotlin-stdlib不引用
NoClassDefFoundError: kotlin/jvm/internal/Intrinsics,
也就是kotlin-stdlib是必須引用的
2、在T模組將,在引用okhttp3時,將kotlin-stdlib排除,單獨直接引用正確的版如下所示,注意kotlin-stdlib引用要放到前面。用此方法後,在T模組檢視maven依賴關係時,沒有衝突。
kotlin-stdlib org.jetbrains.kotlin1.3.70com.squareup.okhttp3 okhttp 4.7.2 kotlin-stdlib org.jetbrains.kotlin
這個方法在T模組有衝突,但是編譯後仍不能使用,再回到A模組檢視,發現A模組存在衝突,查捍IML檔案和External Libraries時,發現kotlin-stdlib有1.2.71和1.3.70兩行,都是繼續T模組過來的,發現1.2.71總是會通過T模組隱性繼承過秋,不知道是什麼因原,可能是為了排除警告一個獲資訊,在T模組加過下面依賴,下面依賴會間接依賴kotlin-stdlib的1.2.71版本,刪除後仍然不誤,在A模組總是兩行,系統使用時仍只會使用1.2.71版本。
com.fasterxml.jackson.module jackson-module-kotlin 2.11.0
3、嘗試直接修改A.iml檔案,刪除1.2.71,只保留1.3.70,External Libraries只有1.3.70一行,編譯專案,系統功能能夠使用。
4、分析主要的依賴路徑問題,路徑短的優先,於是將下面依賴放到A模組,並且在依賴T模組前引用,此時發現A.iml和External Libraries只有1.3.70一行,雖然在A模組衝突檢查有資訊,但是功能不受影響,先繼續使用。
kotlin-stdlib org.jetbrains.kotlin1.3.70
四、小結
通過這個問題解決,對Maven模組依賴傳遞進行了核查和研究,Maven模組的依賴的確挺複雜,在idea下還可能有莫名其妙的問題,在使用時還是需要多加關注。