1. 程式人生 > >Maven學習之路(五)maven的靈活構建--屬性、profile和資源過濾

Maven學習之路(五)maven的靈活構建--屬性、profile和資源過濾

前言

在很多情況下,我們希望專案在不同的階段有不同的構建,開發的時候,使用開發的環境配置,測試的時候,使用測試的環境配置,上線的時候使用其他的配置,雖然說,每次切換專案執行的環境的時候,我們可以手動更改配置,但這樣難免有疏漏之處,導致專案構建的失敗。這個時候,我們就需要Maven進行靈活的構建,使用屬性、profile和資源過濾三個特性達到根據不同的環境構建專案的目的。

一、Maven 屬性

最常見的用法–自定義的Maven屬性

使用properties自定義屬性,,然後使用${}引用上滿定義的屬性

<-定義屬性--->
<properties>
		<oneVirsion>xxxxx</oneVirsion>
</properties>

<!--使用屬性-->
<dependencyManagement>
		<dependency>
			<groupId>...</groupId>
			<artifactId>...</artifactId>
			<version>${oneVirsion}</version>
		</dependency>
</dependencyManagement>

maven內建的屬性

主要有兩個內建屬性

  • ${basedir} 表示專案的根目錄,即包含pom.xml的目錄
  • ${version} 表示專案的版本

POM屬性

使用者可以使用引用POM檔案對應元素的值,例如${project.artifacId},對應了< project > < aritfactId >元素的值。
常用屬性

   	  ${project.build.sourceDirectory}:專案的主原始碼目錄,預設為src/main/java

      ${project.build.testSourceDirectory}:專案的測試原始碼目錄,預設為src/test/java

      ${project.build.directory}:專案構件輸出目錄,預設為target/

      ${project.outputDirectory}:專案主程式碼編譯輸出目錄,預設為target/classes/

      ${project.testOutputDirectory}:專案測試程式碼編譯輸出目錄,預設為target/test-classes/

      ${project.groupId}:專案的groupId    

      ${project.artifactId}:專案的artifactId  

      ${project.version}:專案的version,與${version}等價

      ${project.build.fianlName}:專案打包輸出檔案的名稱。預設為${project.artifactId}-${project.version}

settings.xml 屬性

可以使用sttings. 開頭的屬性引用settings.xml檔案中XML元素的值,例如常用的${settings.localRespository}指向使用者本地倉庫的地址。

Java系統屬性

所有的Java系統屬性都可以使用Maven屬性引用。例如${user.home}指向了使用者目錄。可以使用mvn help:system 檢視所有的Java系統屬性。

環境變數屬性

所有的環境邊浪都可以使用以env.開頭的Maven屬性引用。例如${env.JAVA_HOME},指代了JAVA_HOME環境變數的值。使用者可以使用mvn help:system檢視所有的環境變數。

二、資源過濾

上面說了Maven有哪些屬性可以使用,但是,只有在pom檔案中,$ {xxx}才會被解析,如何在專案的配置檔案中(例如日誌配置檔案、資料庫配置檔案等)使用${xxx}呢?我們需要配置Maven對含有 ${}屬性引用的專案配置檔案進行文字替換,具體方式就是,配置資源的過濾。

   <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
        <!--開啟資源過濾,專案構建時會將當前資原始檔中Maven的屬性檔案替換為配置的檔案-->
        <filtering>true</filtering>
      </resource>
    </resources>

這裡需要注意以下幾點:

  • 超級pom中定義了專案預設的資原始檔夾為${project.basedir}/src/main/resources
  • 需要開啟資源過濾

下面舉個例子:
開啟資源過濾
在這裡插入圖片描述
引用Maven屬性
在這裡插入圖片描述
檢視專案構建後,Maven屬性有沒有替換
在這裡插入圖片描述
圖中顯示Maven屬性已經被替換。

三、profile

profile允許你定義一個環境,在這個環境中你可以自由定製自己所需的專案構建方式。

下面,結合上面介紹的Maven屬性和資源過濾,實現不同環境下,配置檔案中的desc被配置成不同的值:
配置自定義屬性,並開啟資源過濾

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.souche</groupId>
  <artifactId>log-demo</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>log-demo</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>


  <profiles>
  <!--不同構建環境下,desc配置不同的值-->
    <profile>
      <id>p1</id>
      <properties>
        <desc>profile的id為p1時,啦啦啦啦</desc>
      </properties>
    </profile>
    <profile>
      <id>p2</id>
      <properties>
        <desc>profile的id為p2時,嘟嘟嘟嘟嘟</desc>
      </properties>
    </profile>
  </profiles>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>


  <build>
<!--配置資源過濾-->
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources>
    
  </build>
</project>

配置檔案中引用profile中自定義的屬性。
在這裡插入圖片描述
構建專案,並激活(有多種方式,我們先選命令列啟用的方式)不同profile

  • 啟用p1
mvn clean package -DskipTests -Pp1

結果
在這裡插入圖片描述

  • 啟用p2
mvn clean package -DskipTests -Pp2

結果
在這裡插入圖片描述

3.1、profile配置

Profile能讓你為一個特殊的環境自定義一個特殊的構建;profile使得不同環境間構建的可移植性成為可能。Maven中的profile是一組可選的配置,可以用來設定或者覆蓋配置預設值。有了profile,你就可以為不同的環境定製構建。profile可以在pom.xml中配置,並給定一個id。然後你就可以在執行Maven的時候使用的命令列標記告訴Maven執行特定profile中的目標。一個Profiles下面允許出現的元素:

<project>
    <profiles>
        <profile>
            <build>
                <defaultGoal>...</defaultGoal>
                <finalName>...</finalName>
                <resources>...</resources>
                <testResources>...</testResources>
                <plugins>...</plugins>
            </build>
            <reporting>...</reporting>
            <modules>...</modules>
            <dependencies>...</dependencies>
            <dependencyManagement>...</dependencyManagement>
            <distributionManagement>...</distributionManagement>
            <repositories>...</repositories>
            <pluginRepositories>...</pluginRepositories>
            <properties>...</properties>
        </profile>
    </profiles>
</project>

3.2、啟用profile

命令列啟用

使用-P引數,後面緊跟profile的id來啟用profile
例如上面的例子

mvn clean package -DskipTests -Pp2

其他啟用方式還有settings檔案啟用、系統屬性啟用、作業系統換將啟用、預設啟用等其他方式