假如一種場景:比如說spring的jar包版本,由于jar包較多,如果要修改,需要挨個修改,工作量巨大,因此可以使用
org.springframework
spring-tx
4.3.5
轉(zhuǎn)變?yōu)?/p>
UTF-8
4.3.5
org.springframework
spring-tx
${spring.version}
dependencies即使在子項目中不寫該依賴項,那么子項目仍然會從父項目中繼承該依賴項(全部繼承)
dependencyManagement里只是聲明依賴,并不實現(xiàn)引入,因此子項目需要顯示的聲明需要用的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,并且沒有指定具體版本,才會從父項目中繼承該項,并且version和scope都讀取自父pom;另外如果子項目中指定了版本號,那么會使用子項目中指定的jar版本。
Itoo-base(pom.xml) 繼承于 Itoo-base-parent(pom.xml)
示例如下:
Itoo-base-parent(pom.xml)
org.eclipse.persistence
org.eclipse.persistence.jpa
${org.eclipse.persistence.jpa.version}
provided
javax
javaee-api
${javaee-api.version}
Itoo-base(pom.xml)
itoo-base-parent
com.tgb
0.0.1-SNAPSHOT
../itoo-base-parent/pom.xml
4.0.0
itoo-base
ejb
javax
javaee-api
com.fasterxml.jackson.core
jackson-annotations
org.eclipse.persistence
org.eclipse.persistence.jpa
provided
請注意:
子類中沒有指明依賴項的版本信息,在頂層 pom 中的 dependencyManagement 中javaee-api表明其優(yōu)選的版本是 ${javaee-api.version} ,版本信息會注入其中。
只有當 外層的dependencies 元素中沒有指明版本信息時, dependencyManagement 中的 dependencies 元素才起作用。
這樣做的好處:
統(tǒng)一管理項目的版本號,確保應(yīng)用的各個項目的依賴和版本一致,才能保證測試的和發(fā)布的是相同的成果,因此,在頂層pom中定義共同的依賴關(guān)系。同時可以避免在每個使用的子項目中都聲明一個版本號,這樣想升級或者切換到另一個版本時,只需要在父類容器里更新,不需要任何一個子項目的修改;如果某個子項目需要另外一個版本號時,只需要在dependencies中聲明一個版本號即可。子類就會使用子類聲明的版本號,不繼承于父類版本號。
頂層 pom 中的 dependencies 與 dependencyManagement 中的 dependencies 元素有一個重要的區(qū)別:
dependencyManagement 中的 dependencies 元素只表明依賴項版本的優(yōu)先選擇,并不影響項目的依賴項;而 dependencies 元素則影響項目的依賴項。
使用maven來實現(xiàn)多環(huán)境的構(gòu)建可移植性,需要借助maven提供的profile功能,通過不同的環(huán)境激活不同的profile來達到構(gòu)建的可移植性。
一、POM中profile的配置
首先是profile配置,在pom.xml中添加如下profile的配置:
dev
dev
true
test
test
這里定義了三個環(huán)境,dev(開發(fā)環(huán)境)、test(測試環(huán)境),其中開發(fā)環(huán)境是默認激活的(activeByDefault為true),這樣如果在不指定profile時默認是開發(fā)環(huán)境。
同時每個profile還定義了兩個屬性,其中profiles.active表示被激活的profile的配置文件的目錄。
二、工程目錄
針對不同的環(huán)境,我們定義不同的配置文件,而這些配置文件都做為資源文件放到maven工程的文件目錄下(已將src/main/resources改為config),即config目錄下,且各個環(huán)境的配置分別放到相應(yīng)的目錄下,而所有環(huán)境都公用的配置,直接放到config目錄下即可。目錄結(jié)構(gòu)如下所示:
src/main/resources
spring.xml
spring-mvc.xml
properties
dev
dev.properties
test
test.properties
如上所示,開發(fā)環(huán)境、測試環(huán)境的配置文件分別放到config目錄下的dev、test三個子目錄中,剩余公共的配置文件放于config目錄下。
三、POM文件中build配置
在pom中的build節(jié)點下,配置資源文件的位置,如下所示:
config
properties/dev/*
properties/test/*
config/properties/${profiles.active}
首先第一個資源文件位置config需要排隊提各個環(huán)境的配置文件,各個環(huán)境的配置我們在第三個節(jié)點中通過前面在profile中配置的profiles.active屬性來指定。即config/properties/${profiles.active}。這樣在激活指定的profile時,會加載指定目錄下的配置文件,如當前激活的是dev profile,那么這個資源目錄就是config/properties/dev。這樣就達到了不同環(huán)境加載不同配置的目的。
四、項目編譯生成
所有需要的配置就完成了,通過在運行maven命令時指定不同的profile即可構(gòu)建不同環(huán)境需要的war包或發(fā)布到不同的環(huán)境了 。如:
mvn clean package -Ptest 即構(gòu)建出生產(chǎn)環(huán)境需要的war包
war包解壓后,文件結(jié)構(gòu)如下:
WEB-INF
classes
spring.xml
spring-mvc.xml
test.properties
由于默認的profile是dev,所以如果我們不指定profile,那么加載就是開發(fā)環(huán)境dev下的配置文件了。即我們在本地開發(fā)測試時,不用關(guān)心profile的問題。