問題描述
今天遇到一個問題,情況是這樣的:
項目是一個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中定義的版本號。