Maven依賴傳遞同一個Jar在不同module中版本不同

問題描述

今天遇到一個問題,情況是這樣的:

項目是一個spring cloud架構(gòu),其中有兩個module,一個是common通過maven依賴了某個jar,另一個是業(yè)務(wù)module,業(yè)務(wù)module依賴common,結(jié)構(gòu)大致如下:

project
   -- common
      -- someJar: 3.14.0
   -- business
      -- common: 1.0

common中有一個使用someJar的util類,在common中Test運行正常,但是在business中運行卻報錯,提示someJar中的某個類找不到方法。

排查

首先查看了business的Dependencies發(fā)現(xiàn)了一個奇怪的現(xiàn)象:

business
    -- common: 1.0
        -- someJar: 3.6.0

business module的依賴樹中someJar的版本被降低了。而util中使用新版本的方法,因此運行報錯。

但又是什么原因造成這種情況的發(fā)生那?

一開始我認為這是一種不正?,F(xiàn)象,可能是maven的緩存問題(之前使用過低版本的jar),但是經(jīng)過多次clean并沒有解決問題。

那肯定是找錯了方向。

后來我又想到項目的maven設(shè)置parent來做版本管理,可以無需考慮版本適配的問題:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/>
    </parent>

之后就不需要顯式聲明版本號

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

會不會我使用的someJar已經(jīng)在parent中定義了版本號?

我嘗試把common中someJar顯式聲明的版本3.14.0去除,reimprot之后發(fā)現(xiàn)并沒有提示缺少版本號,而且依賴樹中看到的版本號就是3.6.0。已經(jīng)明顯了,問題的原因就是在依賴傳遞過程中someKar的版本被parent中定義的版本號覆蓋了。

解決

找到了問題就好辦了,我在common中指定版本號等于重寫覆蓋了以來的版本,但是在依賴傳遞的過程中,business并沒有使用common中指定的版本,而是修正為parent中定義的版本。要解決這個問題有兩種方法,一是:common中不指定版本號,使用parent定義的版本,但是不能使用新版本的方法。如果一定要使用新版本的方法,那另一種是:在business中也聲明一個someJar的依賴,指定成新版本號,并且排除common中傳遞的依賴。

結(jié)論

對于parent中管理版本號的依賴jar來說,復寫版本號只能在本module中生效,一旦依賴發(fā)生傳遞則會使用parent中定義的版本號。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容