maven---靈活構(gòu)建(一)

包含內(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}構(gòu)建時其值會變成dev沪伙,但是如果放到src/main/resources/目錄下的文件中,如jdbc.properties中县好,構(gòu)建時仍然是{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

參考文章:Maven學(xué)習(xí)筆記(十一):靈活的構(gòu)建

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邻奠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子为居,更是在濱河造成了極大的恐慌碌宴,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒙畴,死亡現(xiàn)場離奇詭異贰镣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)膳凝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門碑隆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹬音,你說我怎么就攤上這事上煤。” “怎么了祟绊?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵楼入,是天一觀的道長哥捕。 經(jīng)常有香客問我,道長嘉熊,這世上最難降的妖魔是什么遥赚? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮阐肤,結(jié)果婚禮上凫佛,老公的妹妹穿的比我還像新娘。我一直安慰自己孕惜,他們只是感情好愧薛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衫画,像睡著了一般毫炉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上削罩,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天瞄勾,我揣著相機(jī)與錄音,去河邊找鬼弥激。 笑死进陡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的微服。 我是一名探鬼主播趾疚,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼以蕴!你這毒婦竟也來了糙麦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤舒裤,失蹤者是張志新(化名)和其女友劉穎喳资,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腾供,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年鲜滩,在試婚紗的時候發(fā)現(xiàn)自己被綠了伴鳖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡徙硅,死狀恐怖榜聂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嗓蘑,我是刑警寧澤须肆,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布匿乃,位于F島的核電站,受9級特大地震影響豌汇,放射性物質(zhì)發(fā)生泄漏幢炸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一拒贱、第九天 我趴在偏房一處隱蔽的房頂上張望宛徊。 院中可真熱鬧,春花似錦逻澳、人聲如沸闸天。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苞氮。三九已至,卻和暖如春瓤逼,著一層夾襖步出監(jiān)牢的瞬間葱淳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工抛姑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赞厕,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓定硝,卻偏偏與公主長得像皿桑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蔬啡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理诲侮,服務(wù)發(fā)現(xiàn),斷路器箱蟆,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,803評論 6 342
  • 當(dāng)前,JVM生態(tài)圈主要的三大構(gòu)建工具: Apache Ant(帶著Ivy) Maven Gradle 對于剛開始接...
    清楓_小天閱讀 5,790評論 1 13
  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注釋 參考 0 前言 什么是...
    seyvoue閱讀 12,597評論 1 36
  • 基礎(chǔ)概念 靈活的構(gòu)建能夠解決項(xiàng)目構(gòu)建過程中一個常常需要面對的問題辈毯,就是不同的平臺環(huán)境差異坝疼,這可能是操作系統(tǒng)的差異、...
    依然愛笑的薰衣草閱讀 345評論 0 0