許多大型的項目都已經模塊化或組件化了,每個組件都可以自己進行版本發布,由於各組件之間有依賴關系,一個組件的版本號頻繁修改(例如每個組件都遵從語義化版本控制語義化版本控制,當bugfix時修訂版本號會頻繁的進行修改),會引起依賴它的組件也需要及時修改依賴的版本號,這樣既繁瑣又低效。這時候可以通過指定范圍依賴來解決,上層的組件可以不用關心下層的組件版本號修改(在不影響使用的前提下)。
下面通過例子說明如何在maven項目中指定范圍依賴,並進行編譯。這里假設某個項目由A、B、C三個組件組成,其中A組件依賴於B組件。在A項目中指定對B組件的范圍依賴,假設依賴B組件的2.3.*版本,即末尾版本號不管怎么修改,A組件都不需要關心,但在每次編譯部署時希望能在maven repo里拉到最新的jar包。
- 在A組件中的指定B的版本依賴為一個范圍區間[2.3.0,2.4.0),即表示了A組件依賴B組件的2.3.*版本。在pom.xml有關配置如下:
<properties>
<b.version>[2.3.0,2.4.0)</b.version>
</properties>
<dependencies>
<dependency>
<groupId>org.xxx.xxx</groupId>
<artifactId>B</artifactId>
<version>${b.version}</version>
</dependency>
</dependencies>
2.按上述在pom文件中配置了依賴的版本范圍,編譯時需要對范圍依賴進行處理,因為編譯時maven會把在該區間內的所有jar包都拉到本地,我們需要指定使用該區間內最新版本的jar包進行編譯組件A。
1)需要添加一個插件:versions-maven-plugin,用來處理范圍依賴中的最新版本。
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.3</version>
</plugin>
</plugins>
</build>
2)執行命令:
mvn versions:resolve-ranges
** 執行完該命令后,pom中指定的版本范圍會被更新指定為該區間內的最新版本。在本例中此時**${b.version}的值會變成
[2.3.0,2.4.0)中最新的版本號,例如2.3.7
3)執行完上述命令后在進行編譯部署等操作
mvn clean install/package/deploy
4) 將pom文件中的指定版本回滾到之前的指定范圍區間
mvn versions:revert
由於在編譯之前已經將指定的范圍依賴更新成了特定的新版本,然后在本地進行編譯,但是此時不能將項目中這個改動上傳到遠程項目,遠程項目中應該是指定的范圍依賴。
因此需要恢復到原來的依賴范圍狀態,因此需要執行下mvn versions:revert進行回滾。此時 <b.version>2.3.7</b.version> 會被回滾成原始的版本 <b.version>[2.3.0,2.4.0)</b.version>
總結下來一句話就是:開發時項目中指定了范圍依賴,本地/CI編譯步驟不再是簡單的mvn compile/install/test/deploy,而是下面三個步驟:
1.mvn versions:resolve-ranges
2.mvn install/package/deploy
3.mvn versions:revert