文章目錄
內置屬性
${basedir}:表示項目根目錄,即包含pom.xml文件的目錄
${version}:表示項目的版本號
POM屬性
${pom.build.sourceDirectory}:項目的主源碼目錄,默認爲src/main/java/
${project.build.testSourceDirectory}:項目的測試源碼目錄,默認爲src/test/java/
${project.build.directory}:項目構建輸出目錄,默認爲target/
${project.build.outputDirectory}:項目主代碼編譯輸出目錄,默認爲target/classes
${project.build.testOutputDirectory}:項目測試代碼編譯輸出目錄,默認爲target/test-classes
${project.groupId}:項目的groupId
${project.artifactId}:項目的artifactId
${project.version}:項目的version,與${version}等價
${project.build.finalName}:項目打包輸出文件的名稱,默認爲${project.artifactId}-${project.version}
Settings屬性
這種屬性以settings.
開頭來引用~/.m2/settings.xml
中的內容,如:
#指向用戶本地倉庫的地址。
${settings.localRepository}
java系統屬性
所有java系統屬性
都可以使用maven
屬性來進行引用,例如${user.home}
指向了當前用戶目錄。
java
系統屬性可以通過mvn help:system
命令看到。
環境變量屬性
所有的環境變量都可以使用env.開頭的方式來進行引用,如:
# 可以獲取環境變量JAVA_HOME的值。
${env.JAVA_HOME}
用戶可以使用
mvn help:system
命令查看所有環境變量的值。
上面的maven
屬性,我們在pom.xml中通過${屬性名稱}
可以靈活的引用,對我們寫pom.xml
文件幫助還是比較大的。
案例
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 配置maven編譯的時候採用的編譯器版本 -->
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<!-- 指定源代碼是什麼版本的 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- maven中執行編譯的時候會用到這個配置 -->
<maven.compiler.target>1.8</maven.compiler.target>
<!--//////////////////// [maven 屬性引用: 通過命令查看變量內容: mvn help:effective-pom > mvn.xml] /////////////////////////////-->
<!-- 項目的主源碼目錄,默認爲src/main/java/ -->
<a>${pom.build.sourceDirectory}</a>
<!-- 項目的測試源碼目錄,默認爲src/test/java/ -->
<b>${project.build.testSourceDirectory}</b>
<!-- 項目構建輸出目錄,默認爲target/ -->
<c>${project.build.directory}</c>
<!-- 項目主代碼編譯輸出目錄,默認爲target/classes -->
<d>${project.build.outputDirectory}</d>
<!-- 項目測試代碼編譯輸出目錄,默認爲target/test-classes -->
<e>${project.build.testOutputDirectory}</e>
<!-- 項目的groupId -->
<f>${project.groupId}</f>
<!-- 項目的artifactId -->
<g>${project.artifactId}</g>
<!-- 項目的version,與${version}等價-->
<h>${project.version}</h>
<!-- 項目打包輸出文件的名稱,默認爲${project.artifactId}-${project.version} -->
<i>${project.build.finalName}</i>
<!-- setting屬性 -->
<!-- 獲取本地倉庫地址-->
<a1>${settings.localRepository}</a1>
<!-- 系統屬性 -->
<!-- 用戶目錄 -->
<a2>${user.home}</a2>
<!-- 環境變量屬性,獲取環境變量JAVA_HOME的值 -->
<a3>${env.JAVA_HOME}</a3>
</properties>
多套環境構建問題
理解資源文件打包過程
resources
目錄中的文件一般放的都是配置文件,配置文件一般最好我們都不會寫死,所以此處有幾個問題:
- 這個插件複製資源文件如何設置編碼?
- 複製的過程中是否能夠對資源文件進行替換,比如在資源文件中使用一些佔位符,然後複製過程中對這些佔位符進行替換。
maven-resources-plugin
這個插件也想到了這個功能,幫我們提供了這樣的功能
設置資源文件複製過程採用的編碼
<properties>
<encoding>UTF-8</encoding>
</properties>
設置資源文件內容動態替換
資源文件中可以通過@maven屬性@
來引用maven屬性中的值,打包的過程中這些會被替換掉,替換的過程默認是不開啓的,需要手動開啓配置。
修改src/main/resource/jdbc.properties
內容如下:
jdbc.url=@jdbc.url@
jdbc.username=@jdbc.username@
jdbc.password=@jdbc.password@
在配置文件中引用 pom 中的 properties 變量時,默認使用 @ 來獲取
pom.xml 中的配置
<!-- 自義定屬性在配置文件 jdbc.properties 中獲取 -->
<jdbc.url>jdbc:mysql://localhost:3306/javacode2018?characterEncoding=UTF-8</jdbc.url>
<jdbc.username>root</jdbc.username>
<jdbc.password>root</jdbc.password>
<build> 下 <resources> 標籤配置如下
:
<resources>
<resource>
<!-- 指定資源文件的目錄 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否開啓過濾替換配置,默認是不開啓的 -->
<filtering>true</filtering>
</resource>
</resources>
自定義替換的分隔符
自定義分隔符,需要我們配置maven-resources-plugin插件的參數,如下:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<configuration>
<!-- 是否使用默認的分隔符,默認分隔符是${*}和@ ,這個地方設置爲false,表示不啓用默認分隔符配置-->
<useDefaultDelimiters>false</useDefaultDelimiters>
<!-- 自定義分隔符 -->
<delimiters>
<delimiter>$*$</delimiter>
<delimiter>##</delimiter>
</delimiters>
</configuration>
</plugin>
</plugins>
delimiters
中可以配置多個delimiter
,可以配置#*#
,其中的*表示屬性名稱,那麼資源文件中的#
屬性名#在複製的過程中會被替換掉,*
前後都是#
,表示前後分隔符都一樣,那麼可以簡寫爲#
,所以#*#
和#
寫法是一樣的,我們去看一下源碼,delimiters的默認值如下:
AbstractMavenFilteringRequest 類
private void initDefaults() {
this.projectStartExpressions.add("pom");
this.projectStartExpressions.add("project");
this.delimiters.add("${*}");
this.delimiters.add("@");
}
maven resources 目標執行
maven 中執行 資源打包操作
mvn resources:resources
maven plugin 插件debug
-
啓動debug
mvnDebug -Dplugin=org.apache.maven.plugins:maven-resources-plugin:3.1.0:resources
-
maven plugin debug 啓動配置
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
指定需要替換的資源文件
<resource>
<!-- 指定資源文件的目錄 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否開啓過濾替換配置,默認是不開啓的 -->
<filtering>true</filtering>
<!--需要被處理的文件列表-->
<includes>
<include>**/jdbc.properties</include>
</includes>
<!--排除需要被處理的資源文件列表-->
<excludes>
<exclude>**/const.properties</exclude>
</excludes>
</resource>
上面使用
includes
列出需要被處理的,使用excludes
排除需要被處理的資源文件列表,採用通配符的寫法,**
匹配任意深度的文件路徑,*
匹配任意個字符。
多個resource元素的使用案例
<resources>
<!-- jdbc.properties 被複制到target下面,但是需要替換裏面的內容 -->
<resource>
<!-- 指定資源文件的目錄 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 是否開啓過濾替換配置,默認是不開啓的 -->
<filtering>true</filtering>
<includes>
<include>**/jdbc.properties</include>
</includes>
</resource>
<!-- const.propertis只是被複制到target下面,但是不要去替換裏面的內容 -->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>**/const.properties</include>
</includes>
</resource>
</resources>
使用profiles處理多環境構建問題
maven
支持讓我們配置多套環境,每套環境中可以指定自己的maven
屬性,mvn
命令對模塊進行構建的時候可以通過-P
參數來指定具體使用哪個環境的配置.
profiles元素支持定義多套環境的配置信息,配置如下用法:
<profiles>
<profile>測試環境配置信息</profile>
<profile>開發環境配置信息</profile>
<profile>線上環境配置信息</profile>
<profile>環境n配置信息</profile>
</profiles>
profiles
中包含多個profile
元素,每個profile
可以表示一套環境,profile
示例如下:
<profile>
<id>dev</id>
<properties>
<jdbc.url>dev jdbc url</jdbc.url>
<jdbc.username>dev jdbc username</jdbc.username>
<jdbc.password>dev jdbc password</jdbc.password>
</properties>
</profile>
id
:表示這套環境的標識信息,properties
可以定義環境中使用到的屬性列表。
執行mvn
命令編譯的時候可以帶上一個-P profileid
來使用指定的環境進行構建。
指定環境進行構建
執行命令
mvn clean package -Pdev
pom.xml 配置
<profiles>
<!-- 開發環境使用的配置 -->
<profile>
<id>dev</id>
<properties>
<jdbc.url>dev jdbc url</jdbc.url>
<jdbc.username>dev jdbc username</jdbc.username>
<jdbc.password>dev jdbc password</jdbc.password>
</properties>
</profile>
<!-- 測試環境使用的配置 -->
<profile>
<id>test</id>
<properties>
<jdbc.url>test jdbc url</jdbc.url>
<jdbc.username>test jdbc username</jdbc.username>
<jdbc.password>test jdbc password</jdbc.password>
</properties>
</profile>
<!-- 線上環境使用的配置 -->
<profile>
<id>prod</id>
<properties>
<jdbc.url>test jdbc url</jdbc.url>
<jdbc.username>test jdbc username</jdbc.username>
<jdbc.password>test jdbc password</jdbc.password>
</properties>
</profile>
</profiles>
注意上面命令中多了一個
-Pdev
參數,-P
後面跟的是pom.xml
中profile的id
,表示需要使用那套環境進行構建。此時我們使用的是dev
環境,即開發環境。
查看目前有哪些環境
mvn help:all-profiles
查看目前激活的是哪些環境
mvn help:active-profiles
b2b 項目多模塊資源打包
mvn clean package -pl :b2b-account-service,:b2b-order-service -Pdev
profile元素更強大的功能
profile
元素可以用於對不同環境的構建進行配置,project
中包含的元素,在profile
元素中基本上都有,所以profile
可以定製更復雜的構建過程,不同的環境依賴的構件、插件、build
過程、測試過程都是不一樣的,這些都可以在profile
中進行指定,也就是說不同的環境所有的東西都可以通過profile元素來進行個性化的設置.
參考
多環境構建
maven屬性定義與使用
maven佔位符的使用
Maven 整合 spring profile實現多環境自動切換
maven佔位符官網文檔
如何調試 Maven Plugin
maven插件開發官網文檔