Maven為了支持構(gòu)建的靈活性,內(nèi)置了3大特性,即:屬性、Profile
和資源過(guò)濾。
6.1 Maven屬性
Maven
的屬性與Java
代碼的常量有異曲同工之妙,都是為了消除重復(fù),對(duì)相關(guān)內(nèi)容進(jìn)行統(tǒng)一管理并且可以減少日后升級(jí)版本的工作量,降低錯(cuò)誤發(fā)生的概率。
在POM
文件中,可以通過(guò)${屬性名稱(chēng)}
的方式來(lái)引用屬性。
在Maven
中,存在6類(lèi)屬性,分別為:
內(nèi)置屬性,主要有兩個(gè),分別為:
${basedir}
表示項(xiàng)目根目錄,即POM文件所在的目錄、${version}
表示項(xiàng)目的版本。-
POM
屬性,用戶(hù)可以通過(guò)該類(lèi)屬性引用POM
文件中對(duì)應(yīng)元素的值,如:${project.artifactId}對(duì)應(yīng)到<project><artifactId>的值,常用的POM屬性有: ${project.build.sourceDirectory}項(xiàng)目的主源碼目錄,默認(rèn)為src/main/java/ ${project.build.testSourceDirectory}項(xiàng)目的測(cè)試源碼目錄,默認(rèn)為src/test/java ${project.build.directory}項(xiàng)目構(gòu)建輸出目錄,默認(rèn)為target/ ${project.outputDirectory}項(xiàng)目主代碼編譯輸出目錄,默認(rèn)為target/classes ${project.testOutputDirectory}項(xiàng)目測(cè)試代碼輸出目錄,默認(rèn)為target/test-classes ${project.groupId}項(xiàng)目的groupId ${project.artifactId}項(xiàng)目的artifactId ${project.version}項(xiàng)目的version,與${version}等價(jià) ${project.build.finalName}項(xiàng)目打包輸出文件名稱(chēng),默認(rèn)為${project.artifactId}-${project.version}
Remark:每一個(gè)
POM
屬性都對(duì)應(yīng)到一個(gè)POM
元素
- 自定義屬性:用戶(hù)在
POM
文件的<properties>
元素下定義的Maven
屬性,如:
<properties>
<spring.boot.version>1.5.9.RELEASE</spring.boot.version>
</properties>
Settings屬性
與POM
屬性同理,使用settings.
開(kāi)頭的屬性引用settings.xml
文件中xml
元素的值,如常用的${settings.localRepository}
引用本地倉(cāng)庫(kù)的地址。Java系統(tǒng)屬性
所有java
系統(tǒng)屬性都可以使用Maven
屬性進(jìn)行引用,如${user.home}
指向用戶(hù)目錄,可以通過(guò)mvn help:system
查看所有的java
系統(tǒng)屬性。環(huán)境變量屬性
所有的環(huán)境變量可以使用env.
開(kāi)頭的Maven
屬性進(jìn)行引用,如${env.JAVA_HOME}
指向了JAVA_HOME
環(huán)境變量的值,可以通過(guò)mvn help:system
查看所有的環(huán)境變量。
6.2 Maven屬性最佳實(shí)踐
6.2.1通過(guò)自定義屬性消除重復(fù)
基于Java
平臺(tái)的開(kāi)發(fā),目前基本都會(huì)引進(jìn)springframework
幫我們簡(jiǎn)化工作,需要MVC
功能,則引入spring-webmvc
,需要事務(wù)管理功能,引入spring-tx
。在我們POM
文件中引入相關(guān)依賴(lài):
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
當(dāng)我們需要升級(jí)springframework
的時(shí)候,需要修改多個(gè)地方,如果這些依賴(lài)不放在一起的時(shí)候,則容易造成漏更改,導(dǎo)致多版本并存,這個(gè)時(shí)候,可以使用自定義屬性,如:
<properties>
<springframework.version>4.3.14.RELEASE</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
當(dāng)需要進(jìn)行版本升級(jí)的時(shí)候,只需要修改springframework.version
屬性即可。
6.2.2使用POM屬性依賴(lài)內(nèi)部模塊
在一個(gè)多項(xiàng)目中,模塊之間一般會(huì)有依賴(lài),并且這些模塊通常會(huì)使用同一的groupId
和version
,這個(gè)時(shí)候可以使用POM
屬性,如:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>demo-base</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
這樣,當(dāng)進(jìn)行項(xiàng)目版本升級(jí)時(shí),就不需要更改依賴(lài)模塊的版本了。