亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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 文件中的依賴,也讓多環境構建變得更加簡單。