1. 程式人生 > 其它 >idea 模組jdk依賴總是自動變_Maven子模組間依賴傳遞導致元件版本降級問題

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

c59db6654f244ef3085af14de787e73d.png

二、問題原因分析

通過與原來的單模組反覆對比,也試過各種版本調整,問題仍不能解決,kotlin-stdlib效有效版本總是1.2.71.

開啟模組T的pom檔案,檢視結構,檢查衝突會出現以下內容,明確出衝突:

637079400e39b893a281497476743984.png

打、開專案檔案樹的A模組的iml檔案發現有stdlib1.2.71內容,通過關係查詢,發現是A依賴T,通過T模組引用而來,但是版本總是1.2.71,通過okhttp 4.7.2檔案對應,應該是1.3.71才對,但是idea不知為何,引進的總是1.2.71,導致系統問題。

檢視,專案External Libraries,如下圖,是舊版本。

359b844e793a5c7e5e4d0b4badf9e7f1.png

三、解決方法

發現這個問題原因後,先做了以下幾面嘗試,

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下還可能有莫名其妙的問題,在使用時還是需要多加關注。