包含內(nèi)容
- maven屬性
- 構(gòu)建環(huán)境的差異
- 資源過濾
- Maven Profile
- Web資源過濾
- 在profile中激活集成測試
- 小結(jié)
前言
- 靈活構(gòu)建:
- 項(xiàng)目都會有開發(fā)環(huán)境棒旗、測試環(huán)境和產(chǎn)品環(huán)境于样,這些環(huán)境的數(shù)據(jù)庫庫配置不盡相同,那么項(xiàng)目構(gòu)建的時候就需要能夠識別所在環(huán)境并使用正確的配置浪慌。
- 項(xiàng)目開發(fā)了大量的集成測試,這些測試運(yùn)行起來非常耗時陌知,不適合在每次構(gòu)建項(xiàng)目時都運(yùn)行呻引,因此需要一些手段能讓我們在特定的時候才激活這些集成測試。
- maven如何實(shí)現(xiàn)靈活構(gòu)建祸憋,內(nèi)置了三大特性:
- 屬性
- Profile
- 資源過濾
1.Maven屬性
- maven中有6類屬性:
- 內(nèi)置屬性
- POM屬性
- 自定義屬性
- Settings屬性
- Java系統(tǒng)屬性
- 環(huán)境變量屬性
1.1 內(nèi)置屬性
- 主要有兩個常用內(nèi)置屬性
${basedir}表示項(xiàng)目根目錄会宪,即包含pom.xml文件的目錄
${version}表示項(xiàng)目版本
1.2 POM屬性
- 用戶可以使用該類屬性引用POM文件中對應(yīng)元素的值。例如${project.artifactId}就對應(yīng)了<project><artifactId>元素的值.
- 常用的POM屬性包括:
${project.build.sourceDirectory}:項(xiàng)目的主源碼目錄蚯窥,默認(rèn)為src/main/java/掸鹅。
${project.build.testSourceDirectory}:項(xiàng)目的測試源碼目錄,默認(rèn)為src/test/java/拦赠。
${project.build.directory}:項(xiàng)目構(gòu)建輸出目錄巍沙,默認(rèn)為target/。
${project.outputDirectory}:項(xiàng)目的主代碼編譯輸出目錄荷鼠,默認(rèn)為target/classes/句携。
${project.testOutputDirectory}:項(xiàng)目測試代碼編譯輸出目錄,默認(rèn)為target/test-classes/允乐。
${project.groupId}:項(xiàng)目的groupId矮嫉。
${project.artifactId}:項(xiàng)目的artifactId。
${project.version}:項(xiàng)目的version牍疏。
${project.build.finalName}:項(xiàng)目打包輸出文件的名稱蠢笋,默認(rèn)為${project.artifactId}-${project.version}。
<jdk.version>1.6</jdk.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- 這些屬性都對應(yīng)了一個POM元素鳞陨,它們中的一些屬性的默認(rèn)值是在超級POM中定義的昨寞。
1.3 自定義屬性
- 用戶可以在POM的<properties>元素下自定義Maven屬性。例如:
<project>
...
<properties>
<my.prop>hello</my.prop>
</properties>
...
</project>
- 然后在POM中其他地方使用${my.prop}的時候會被替換成hello。
1.4 Settings屬性
- 與POM屬性同理援岩,用戶使用以settings.開頭的屬性引用settings.xml文件中XML元素的值熟史,如常用的${settings.localRepository}指向用戶本地倉庫的地址。
1.5 Java系統(tǒng)屬性
- 所有Java系統(tǒng)屬性都可以使用Maven屬性引用窄俏,例如${user.home}指向了用戶目錄蹂匹。用戶可以使用mvn help:system查看所有的Java系統(tǒng)屬性。文章后面列出了查詢的結(jié)果凹蜈。
1.6 環(huán)境變量屬性
- 所有環(huán)境變量都可以使用以env.開頭的Maven屬性引用限寞。例如${env.JAVA_HOME}指代了JAVA_HOME環(huán)境變量的值。用戶可以使用mvn help:system查看所有的Java系統(tǒng)屬性仰坦。
使用范例
- 在一個多模塊項(xiàng)目中履植,模塊之間的依賴比較常見,這些模塊通常會使用同樣的groupId和version悄晃,這個時候就可以使用POM屬性玫霎。
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>account-email</artifacId>
<version>${project.version}</version>
</denpendency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>account-persist</artifacId>
<version>${project.version}</version>
</denpendency>
</dependencies>
- 在配置插件的時候,同樣可以使用Maven屬性來方便地自定義插件行為妈橄。如:maven-surefire-plugin插件運(yùn)行后默認(rèn)的測試報(bào)告目錄為target/surefire-reports庶近,這實(shí)際上就是${project.build.directory}/surefire-reports,查詢該插件文檔眷蚓,發(fā)現(xiàn)該插件提供了reportsDirectory參數(shù)來配置測試報(bào)告目錄鼻种。因此如果想要改變測試報(bào)告目錄,如改成target/test-reports沙热,就可以使用下面代碼:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<configuration>
<skip>false</skip> <!-- 不跳過執(zhí)行測試代碼 -->
<reportsDirectory>${project.build.directory}/test-reports</reportsDirectory>
</configuration>
</plugin>
2. 構(gòu)建環(huán)境的差異
- 在不同的環(huán)境中叉钥,項(xiàng)目的源碼應(yīng)該使用不同的方式進(jìn)行構(gòu)建。
例如篙贸,我們在開發(fā)環(huán)境可能使用一套數(shù)據(jù)庫配置投队。
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/iqasdb?useUnicode=true&characterEncoding=UTF-8
jdbc.user=dev
jdbc.password=dev-pwd
在線上環(huán)境可能使用另外一套數(shù)據(jù)庫配置。
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://172.19.201.168:3306/iqasdb?useUnicode=true&characterEncoding=UTF-8
jdbc.user=test
jdbc.password=test-pwd
- 相似的爵川,對于緩存的配置敷鸦、對于其他應(yīng)用的RFC鏈接都可能在不同的生產(chǎn)環(huán)境下有不同的配置。
- 那么對于不同環(huán)境的構(gòu)建差異雁芙,要保證項(xiàng)目在不同的環(huán)境中都能正確的按照期望的來構(gòu)建轧膘,作為一個構(gòu)建 工具如何實(shí)現(xiàn)呢?
- 實(shí)現(xiàn)思路:針對開發(fā)兔甘、測試等不同環(huán)境定義多組參數(shù)谎碍,在系統(tǒng)的配置文件中通過參數(shù)進(jìn)行引用。在項(xiàng)目構(gòu)建時對這些配置文件進(jìn)行攔截洞焙,將參數(shù)使用值進(jìn)行替換蟆淀,但是因?yàn)閷Σ煌h(huán)境配置了多組參數(shù)拯啦,究竟使用哪一組進(jìn)行替換需要通過一定的方式(命令行、settings文件熔任、系統(tǒng)屬性等)來指明褒链。這樣就可以實(shí)現(xiàn)不同環(huán)境進(jìn)行特定的構(gòu)建。
- 為此需要做的事情大概涉及一下幾件事:1.為不同環(huán)境定義多組屬性疑苔。2.在系統(tǒng)資源文件中使用屬性名稱來配置甫匹,后期替換成真正需要的值。3.通過一種方式指明構(gòu)建項(xiàng)目時使用哪一組屬性惦费。4.對系統(tǒng)中使用屬性名稱進(jìn)行配置的資源文件進(jìn)行攔截兵迅,并將資源文件中的屬性名稱使用定義的屬性值進(jìn)行替換。
- 下面通過靈活配置數(shù)據(jù)庫信息進(jìn)行具體說明薪贫。
3.資源過濾
3.1需求案例
- 對于數(shù)據(jù)庫的配置來說恍箭,我們一般會在src/main/resources目錄下添加數(shù)據(jù)庫的配置文件jdbc.properties文件。連接數(shù)據(jù)庫使用的驅(qū)動類瞧省、URL扯夭、用戶名和密碼都可能發(fā)生變化,因此用Maven屬性取代它們鞍匾。
3.2實(shí)現(xiàn)步驟
3.2.1. 在 jdbc.properties文件中使用屬性
jdbc.driverClass=${db.driver}
jdbc.jdbcUrl=${db.url}
jdbc.user=${db.username}
jdbc.password=${db.username}
- 這里使用了4個Maven屬性交洗,db.driver、db.url等候学,它們的命名是任意的藕筋,視情況而選擇合適名稱纵散。
3.2.2.在POM中定義profile定義屬性
既然使用了Maven屬性梳码,我們就需要在某個地方定義他們,前面介紹了自定義maven屬性伍掀,而上面這些屬性主要為了適應(yīng)不同開發(fā)環(huán)境掰茶,所以maven提供了profile可以對不同屬性進(jìn)行分類。在這里我們需要用到profile將其包裹起來蜜笤,而且profile定義在POM中濒蒋。
<project>
<profiles>
<profile>
<id>dev</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://172.19.201.168:3306/iqasdb?useUnicode=true&characterEncoding=UTF-8</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
</properties>
</profile>
</profiles>
</project>
3.3.3 配置maven-resources-plugin插件開啟資源過濾
- 有了屬性定義,配置文件中也使用了這些屬性把兔,但是這些屬性目前只能在POM中使用,如在POM使用{db.username}围橡。因此要讓Maven解析資源文件中的Maven屬性。
- 資源文件的處理其實(shí)是maven-resources-plugin做的事情缕贡,它默認(rèn)的行為只是將項(xiàng)目主資源文件復(fù)制到主代碼編譯輸出目錄中(target/classes),將測試資源文件復(fù)制到測試代碼編譯輸出目錄中翁授,要讓該插件能夠解析資源文件中的Maven屬性拣播,就需要開啟資源過濾,被過濾的文件Maven就會將其中的Maven屬性替換成對應(yīng)的值收擦。
- 為主資源目錄和測試資源目錄開啟過濾贮配。
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<testResources>
<testResource>
<directory>${basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>
3.3.4 激活profile
一切準(zhǔn)備就緒,最后只要在命令行激活profile塞赂,maven就能夠在構(gòu)建項(xiàng)目的時候使用profile中屬性值替換數(shù)據(jù)庫配置文件中的屬性引用泪勒。
命令:
mvn clean install -Pdev
-P參數(shù)表示在命令行激活一個profile。這里激活了id為dev的profile(多個id之間以逗號分隔)宴猾。構(gòu)建完成后酣藻,輸出目錄中的數(shù)據(jù)庫配置就是開發(fā)環(huán)境的配置了:
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/iqasdb?useUnicode=true&characterEncoding=UTF-8
jdbc.user=dev
jdbc.password=dev-pwd
下一節(jié)內(nèi)容
Maven Profile:profile更多的激活方式、不同的種類(不僅僅只有pom.xml可以定義哦鳍置,定義位置不同作用范圍也不一樣)辽剧、profile中可使用的元素等。
Web資源過濾:除了一般資源文件(src/main/resources)外税产,web還有包括了一種web資源文件(src/main/webapp)怕轿,對于web資源文件的過濾又是怎么的呢?(首先處理web資源文件的插件不是maven-resources-plugin辟拷,所以配置resources時沒用的撞羽。)
在profile中激活集成測試:一個項(xiàng)目中會有單元測試也會有集成測試,單元測試運(yùn)行快衫冻,因此構(gòu)建項(xiàng)目就快诀紊,集成測試運(yùn)行比較耗時,所以如果不想每次構(gòu)建都運(yùn)行集成測試該怎么辦呢隅俘?
- 通過mvn help:system查看的java系統(tǒng)屬性(其中系統(tǒng)環(huán)境變量沒有顯示粘貼出來)
===============================================================================
========================= Platform Properties Details =========================
===============================================================================
===============================================================================
System Properties
===============================================================================
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D:\Soft\Java\jdk1.8.0_65\jre\bin
java.vm.version=25.65-b01
maven.multiModuleProjectDirectory=C:\Users\dell
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
guice.disable.misplaced.annotation.check=true
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.country=CN
user.script=
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=Service Pack 1
java.vm.specification.name=Java Virtual Machine Specification
user.dir=C:\Users\dell
java.runtime.version=1.8.0_65-b17
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=D:\Soft\Java\jdk1.8.0_65\jre\lib\endorsed
os.arch=amd64
java.io.tmpdir=C:\Users\dell\AppData\Local\Temp\
line.separator=
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 7
classworlds.conf=D:\Soft\maven\apache-maven-3.3.3\bin\m2.conf
sun.jnu.encoding=GBK
java.library.path=D:\Soft\Java\jdk1.8.0_65\bin;C:\Windows\Sun\Java\bin;C:\Window
s\system32;C:\Windows;D:\Soft\Spring-Boot-CLI\bin;D:\Soft\nexus-3.1.0-04-win64\n
exus-3.1.0-04\bin;D:\Soft\maven\apache-maven-3.3.3\bin;D:\Soft\Java\jdk1.8.0_65\
bin;D:\Soft\Java\jdk1.8.0_65\jre\bin;C:\ProgramData\Oracle\Java\javapath;C:\Prog
ram Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Window
s\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerS
hell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Fil
es\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(
R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Manage
ment Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engi
ne Components\IPT;D:\Soft\VanDyke Software\Clients\;D:\Soft\git\Git\bin;D:\Soft\
mysql\installationpath\MySQL Server 5.5\bin;.
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=6.1
user.home=C:\Users\dell
user.timezone=Asia/Shanghai
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=GBK
java.specification.version=1.8
java.class.path=D:\Soft\maven\apache-maven-3.3.3\boot\plexus-classworlds-2.5.2.j
ar
user.name=dell
java.vm.specification.version=1.8
sun.java.command=org.codehaus.plexus.classworlds.launcher.Launcher help:system
java.home=D:\Soft\Java\jdk1.8.0_65\jre
sun.arch.data.model=64
user.language=zh
java.specification.vendor=Oracle Corporation
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_65
java.ext.dirs=D:\Soft\Java\jdk1.8.0_65\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.boot.class.path=D:\Soft\Java\jdk1.8.0_65\jre\lib\resources.jar;D:\Soft\Java\
jdk1.8.0_65\jre\lib\rt.jar;D:\Soft\Java\jdk1.8.0_65\jre\lib\sunrsasign.jar;D:\So
ft\Java\jdk1.8.0_65\jre\lib\jsse.jar;D:\Soft\Java\jdk1.8.0_65\jre\lib\jce.jar;D:
\Soft\Java\jdk1.8.0_65\jre\lib\charsets.jar;D:\Soft\Java\jdk1.8.0_65\jre\lib\jfr
.jar;D:\Soft\Java\jdk1.8.0_65\jre\classes
java.vendor=Oracle Corporation
sun.stderr.encoding=ms936
maven.home=D:\Soft\maven\apache-maven-3.3.3
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.stdout.encoding=ms936
sun.desktop=windows
sun.cpu.isalist=amd64