Maven 屬性與資源過濾
在之前的章節(jié)中,我們已經(jīng)介紹了 Maven 如何使用 Profile 來進(jìn)行構(gòu)建。類似的,對于 Maven 來說,還有很多其他的資源或者屬性,而這些資源或者屬性也都是可以進(jìn)行過濾的,這一小節(jié)中,我們就重點(diǎn)介紹一下在什么情況下,需要過濾這些,并且要如何進(jìn)行操作。
1. 屬性
首先,我們來介紹一下 Maven 的屬性特性。其實(shí),在我們之前的章節(jié)中,一直都有在使用 Maven 的屬性。例如我們在引入 Spring 框架的時候,將 Spring 框架的版本號信息抽象出來,放到 properties 節(jié)點(diǎn)中去,在使用這個版本號的時候,可以通過${}
來引用。
<properties>
<spring.version>4.0.2.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
我們都知道抽象了spring.version
屬性之后,可以減少我們很多的工作量,而且也便于我們對 pom.xml 文件的管理。在 Maven 的世界中,這只是其中一種屬性。那我們來介紹一下 Maven 的屬性的種類。
- 內(nèi)置屬性: Maven 的內(nèi)置屬性主要有兩個,一個是
${basedir}
用來表示項(xiàng)目的根目錄,另一個是${version}
用來表示項(xiàng)目的版本號; - POM屬性: 用來引用 pom.xml 文件中對應(yīng)元素的值。一般來說,可以用
${project.*}
來表示,例如:${project.groupId}
就是用來表示項(xiàng)目的 groupId 信息; - 自定義屬性: 這個比較容易理解,就像我們上面例子中的
${spring.version}
就屬于自定義屬性的范圍; - Settings屬性: 與 POM 屬性類似。通常使用
${settings.*}
來表示,Settings 屬性用來指向 settings.xml 文件中的屬性,例如:${settings.localrepository}
可以用來表示本地倉庫的地址; - Java系統(tǒng)屬性: 所有 Java 的系統(tǒng)屬性都可以通過 Maven 屬性來引用。我們在使用之前可以通過
mvn help:system
命令來查看對應(yīng)的屬性; - 環(huán)境變量屬性: 所有的環(huán)境變量屬性都可以通過 Maven 屬性來引用。通常用
${env.*}
來表示。
我們在很多地方都可以用到 Maven 屬性,例如我們的示例項(xiàng)目中,多模塊直接互相引用的時候,我們會用到${project.groupId}
和${project.version}
,來管理項(xiàng)目內(nèi)部依賴。會用到${project.basedir}
來指定項(xiàng)目配置文件的路徑。
2. Profile
這里就是之前章節(jié)中講到的 Profile ,所以在這里,我們就不做過多的介紹,可以移步到《Maven 使用 Profile 構(gòu)建》一節(jié)進(jìn)行學(xué)習(xí)。
3. 資源過濾
我們使用 Maven 資源過濾的目的和使用 Profile 的目的很大程度上是類似的,就是為了增強(qiáng)項(xiàng)目構(gòu)建的可移植性。之前我們在 Profile 的章節(jié)中,講到了在構(gòu)建項(xiàng)目的時候,激活對應(yīng)的 Profile 來使用對應(yīng)的配置,當(dāng)時我們把配置都放在了配置文件中,因此,如果有多套環(huán)境的話,那么配置文件就相應(yīng)的需要多套。
這里,我們換一種方式來進(jìn)行資源過濾。在講 Profile 的章節(jié)中,我們使用 mall-order 模塊來演示,這次我們換為 mall-delivery 模塊來演示。
首先在 src\main\resources
目錄下添加application.yml
文件,用作配置文件。文件中的內(nèi)容如下:
spring:
datasource:
driver-class-name: ${database.driverClass}
username: ${database.username}
password: ${database.password}
url: ${database.url}
type: com.alibaba.druid.pool.DruidDataSource
這里,可以看到,我們使用了${}
的方式來引用屬性,這個屬性可以定義在pom.xml
文件中。
接下來,我們就在pom.xml
文件中配置對應(yīng)的屬性。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<profiles>
<profile>
<id>dev</id>
<properties>
<database.driverClass>com.mysql.cj.jdbc.Driver</database.driverClass>
<database.url>jdbc:mysql://localhost:3306/dev</database.url>
<database.username>userNameDev</database.username>
<database.password>passwordDev</database.password>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<database.driverClass>com.mysql.cj.jdbc.Driver</database.driverClass>
<database.url>jdbc:mysql://localhost:3307/test</database.url>
<database.username>userNameTest</database.username>
<database.password>passwordTest</database.password>
</properties>
</profile>
</profiles>
通常情況下,資源過濾是關(guān)閉的,如果需要開啟,則需要我們手動設(shè)置 <filtering>true</filtering>
。默認(rèn)關(guān)閉也是為了防止在構(gòu)建的過程中發(fā)生一些不必要的過濾情況。
這里,我們分別配置了開發(fā)環(huán)境的數(shù)據(jù)庫信息和測試環(huán)境的數(shù)據(jù)庫信息(其實(shí)也是使用的 Profile 的方式)。其中 properties 節(jié)點(diǎn)配置了我們自定義的屬性,其與我們剛剛在application.yml
文件中配置的占位符是一樣的。
接下來,我們進(jìn)行項(xiàng)目構(gòu)建可以指定對應(yīng)的 Profile,執(zhí)行 Maven 命令mvn clean package -Pdev
。構(gòu)建完成后,我們可以查看target\classes
目錄下的構(gòu)建結(jié)果,會發(fā)現(xiàn)配置文件中的確是用的開發(fā)環(huán)境的 Profile,目的達(dá)成。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: userNameDev
password: passwordDev
url: jdbc:mysql://localhost:3306/dev
type: com.alibaba.druid.pool.DruidDataSource
以上的配置,還可以進(jìn)行一下修改。由于我們平時更多的是在用開發(fā)環(huán)境的配置,因此,我們可以把開發(fā)環(huán)境的配置單獨(dú)放置出來。
<build>
...
</build>
<properties>
<database.driverClass>com.mysql.cj.jdbc.Driver</database.driverClass>
<database.url>jdbc:mysql://localhost:3306/dev</database.url>
<database.username>userNameDev</database.username>
<database.password>passwordDev</database.password>
</properties>
<profiles>
<profile>
<id>test</id>
<properties>
<database.driverClass>com.mysql.cj.jdbc.Driver</database.driverClass>
<database.url>jdbc:mysql://localhost:3307/test</database.url>
<database.username>userNameTest</database.username>
<database.password>passwordTest</database.password>
</properties>
</profile>
</profiles>
這樣修改之后,我們在進(jìn)行開發(fā)環(huán)境構(gòu)建的時候,不需要添加額外的參數(shù),直接執(zhí)行命令mvn clean package
即可正常構(gòu)建。而當(dāng)我們需要構(gòu)建其他環(huán)境程序包的時候,則在命令后面添加對應(yīng)的參數(shù)。
4. 小結(jié)
本文,我們承接《Maven 使用 Profile 構(gòu)建》一節(jié),繼續(xù)介紹 Maven 的屬性和資源過濾,學(xué)了這兩節(jié)之后,能夠更方便,更明晰的管理 pom.xml 文件中的依賴,也讓多環(huán)境構(gòu)建變得更加簡單。