Maven 屬性與資源過濾
在之前的章節中,我們已經介紹了 Maven 如何使用 Profile 來進行構建。類似的,對于 Maven 來說,還有很多其他的資源或者屬性,而這些資源或者屬性也都是可以進行過濾的,這一小節中,我們就重點介紹一下在什么情況下,需要過濾這些,并且要如何進行操作。
1. 屬性
首先,我們來介紹一下 Maven 的屬性特性。其實,在我們之前的章節中,一直都有在使用 Maven 的屬性。例如我們在引入 Spring 框架的時候,將 Spring 框架的版本號信息抽象出來,放到 properties 節點中去,在使用這個版本號的時候,可以通過${}
來引用。
<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 的屬性的種類。
- 內置屬性: Maven 的內置屬性主要有兩個,一個是
${basedir}
用來表示項目的根目錄,另一個是${version}
用來表示項目的版本號; - POM屬性: 用來引用 pom.xml 文件中對應元素的值。一般來說,可以用
${project.*}
來表示,例如:${project.groupId}
就是用來表示項目的 groupId 信息; - 自定義屬性: 這個比較容易理解,就像我們上面例子中的
${spring.version}
就屬于自定義屬性的范圍; - Settings屬性: 與 POM 屬性類似。通常使用
${settings.*}
來表示,Settings 屬性用來指向 settings.xml 文件中的屬性,例如:${settings.localrepository}
可以用來表示本地倉庫的地址; - Java系統屬性: 所有 Java 的系統屬性都可以通過 Maven 屬性來引用。我們在使用之前可以通過
mvn help:system
命令來查看對應的屬性; - 環境變量屬性: 所有的環境變量屬性都可以通過 Maven 屬性來引用。通常用
${env.*}
來表示。
我們在很多地方都可以用到 Maven 屬性,例如我們的示例項目中,多模塊直接互相引用的時候,我們會用到${project.groupId}
和${project.version}
,來管理項目內部依賴。會用到${project.basedir}
來指定項目配置文件的路徑。
2. Profile
這里就是之前章節中講到的 Profile ,所以在這里,我們就不做過多的介紹,可以移步到《Maven 使用 Profile 構建》一節進行學習。
3. 資源過濾
我們使用 Maven 資源過濾的目的和使用 Profile 的目的很大程度上是類似的,就是為了增強項目構建的可移植性。之前我們在 Profile 的章節中,講到了在構建項目的時候,激活對應的 Profile 來使用對應的配置,當時我們把配置都放在了配置文件中,因此,如果有多套環境的話,那么配置文件就相應的需要多套。
這里,我們換一種方式來進行資源過濾。在講 Profile 的章節中,我們使用 mall-order 模塊來演示,這次我們換為 mall-delivery 模塊來演示。
首先在 src\main\resources
目錄下添加application.yml
文件,用作配置文件。文件中的內容如下:
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
文件中配置對應的屬性。
<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>
通常情況下,資源過濾是關閉的,如果需要開啟,則需要我們手動設置 <filtering>true</filtering>
。默認關閉也是為了防止在構建的過程中發生一些不必要的過濾情況。
這里,我們分別配置了開發環境的數據庫信息和測試環境的數據庫信息(其實也是使用的 Profile 的方式)。其中 properties 節點配置了我們自定義的屬性,其與我們剛剛在application.yml
文件中配置的占位符是一樣的。
接下來,我們進行項目構建可以指定對應的 Profile,執行 Maven 命令mvn clean package -Pdev
。構建完成后,我們可以查看target\classes
目錄下的構建結果,會發現配置文件中的確是用的開發環境的 Profile,目的達成。
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
以上的配置,還可以進行一下修改。由于我們平時更多的是在用開發環境的配置,因此,我們可以把開發環境的配置單獨放置出來。
<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>
這樣修改之后,我們在進行開發環境構建的時候,不需要添加額外的參數,直接執行命令mvn clean package
即可正常構建。而當我們需要構建其他環境程序包的時候,則在命令后面添加對應的參數。
4. 小結
本文,我們承接《Maven 使用 Profile 構建》一節,繼續介紹 Maven 的屬性和資源過濾,學了這兩節之后,能夠更方便,更明晰的管理 pom.xml 文件中的依賴,也讓多環境構建變得更加簡單。