靈活的構(gòu)建

基礎(chǔ)概念

靈活的構(gòu)建能夠解決項(xiàng)目構(gòu)建過程中一個(gè)常常需要面對的問題,就是不同的平臺(tái)環(huán)境差異,這可能是操作系統(tǒng)的差異、平臺(tái)開發(fā)和測試平臺(tái)的差異、不同客戶之間的差異。為了應(yīng)對這些差異,Maven提供了屬性、資源過濾以及profile三大特性。

Maven屬性

內(nèi)置屬性:主要有兩個(gè)常用內(nèi)置屬性,${basedir}表示項(xiàng)目根目錄,即包含pom.xml文件的目錄,${version}表示項(xiàng)目版本。

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/main/test/java/
${project.build.directory}:項(xiàng)目構(gòu)建輸出目錄,默認(rèn)為target/
${project.outputDirectory}:項(xiàng)目主代碼編譯目錄,默認(rèn)為src/test/java/
${project.testOutputDirectory}:項(xiàng)目測試代碼編譯輸出目錄,默認(rèn)為target/classes/

這些屬性都對應(yīng)了一個(gè)POM元素,它們中一些屬性的默認(rèn)值都是在超級(jí)POM中定義的,更多POM元素也可以在超級(jí)POM中查看。

自定義屬性,用戶可以在POM的<properties>元素下自定義Maven屬性。例如:

<properties>
  <my.prop>hello</my.prop>
</properties>

然后在POM中其它地方使用${my.prop}的時(shí)候會(huì)被替換成hello。

Settings屬性:與POM屬性同理,用戶使用以settings.開頭的屬性引用setting.xml文件中XML元素的值。如常用的${settings.localRepository}指向用戶本地倉庫的地址。

Java系統(tǒng)屬性:所有Java系統(tǒng)屬性都可以使用Maven屬性引用,例如${user.home}指向了用戶目錄。用戶可以使用mvn help:system查看所有的Java系統(tǒng)屬性。

環(huán)境變量屬性:所有環(huán)境變量屬性都可以使用env.開頭的Maven屬性引用。例如${env.JAVA_HOME}指向了用戶目錄。用戶可以使用mvn help:system查看所有的環(huán)境變量。

資源過濾

開啟資源過濾只需要超級(jí)POM中,只需要在默認(rèn)資源文件配置中,加入一行filtering配置即可,如代碼清單:

<resources>
  <resource>
    <directory>${project.basedir}/src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

我們將數(shù)據(jù)庫配置的變化部分提取成了Maven屬性,在POM的profile中定義了這些屬性的值,再通過命令行激活profile,Maven就能夠在構(gòu)建項(xiàng)目的時(shí)候使用profile中屬性值替換數(shù)據(jù)庫配置文件中的屬性引用,運(yùn)行命令如下:

$mvn clean install-Pdev

mvn的-P參數(shù)表示在命令行激活一個(gè)profile,當(dāng)然可以同時(shí)激活幾個(gè),以‘,’隔開。

激活profile的方法

命令行激活:用戶可以使用mvn命令行參數(shù)-P加上profile的id來激活profile。

$ mvn clean install -Pdev,dev-y

settings文件顯式激活:如果用戶希望某個(gè)profile默認(rèn)一直處于激活狀態(tài),就可以配置settings.xml文件的activeProfiles元素,表示其配置的profile對于所有項(xiàng)目都處于激活狀態(tài)

<activeProfiles>
  <activeProfile>dev - x</activeProfile>
</activeProfiles>

系統(tǒng)屬性激活:用戶可以配置當(dāng)某系統(tǒng)存在的時(shí)候,自動(dòng)激活profile

<profile>
  <activation>
    <property>
      <name>test</name>
    </property>
  </activation>
</profile>

操作系統(tǒng)環(huán)境激活:Profile還可以自動(dòng)根據(jù)操作系統(tǒng)環(huán)境激活,如果構(gòu)建在不同的操作系統(tǒng)有差異,用戶完全可以將這些差異寫進(jìn)profile,然后配置它們自動(dòng)基于操作系統(tǒng)環(huán)境激活

<profile>
  <activation>
    <oa>
      <name>Windows XP</name>
      <family>Windows</family>
      <arch>x86</arch>
      <version>5.1.2600</version>
    </oa>
  </activation>
</profile>

這里family的值包括Windows、UNIX和MAac等,而其它幾項(xiàng)name、arch、version,用戶可以通過查看環(huán)境中的系統(tǒng)屬性os.name、os.arch、os.version獲得。

文件存在與否激活
Maven能夠根據(jù)項(xiàng)目中某個(gè)文件存在與否來決定是否激活profile

<profile>
  <activation>
    <file>
      <missing>x.properties</missing>
      <exists>y.properties</exists>
    </file>
  </activation>
</profile>

默認(rèn)激活:用戶可以在定義profile的時(shí)候指定其默認(rèn)激活,不過如果POM中有任何一個(gè)profile通過以上其他任意一種方式被激活了,所有的默認(rèn)激活配置都會(huì)失效。

<profile>
  <id>dev</id>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
</profile>

補(bǔ)充:maven-help-plugin提供了一個(gè)目標(biāo)幫助用戶了解當(dāng)前激活的profile,$ mvn help:active-profiles;它還有另一個(gè)目標(biāo)用來列出當(dāng)前所有的profile,$ mvn help:all-profiles

profile的種類

1.pom.xml:很顯然,pom.xml聲明的profile只對當(dāng)前項(xiàng)目有效
2.用戶settings.xml:用戶目錄下.m2/settings.xml中的profile對本機(jī)上該用戶所有的Maven項(xiàng)目有效
3.全局settings.xml:Maven安裝目錄下conf/settings.xml對本機(jī)上所有的Maven項(xiàng)目有效
4.profiles.xml:和pom.xml聲明在同一目錄下,基本不用不做介紹

為了保證該profile伴隨某個(gè)特定的pom.xml文件一起存在,profile大部分都是聲明在pom.xml文件中的,它可以修改或者增加很多POM元素的。Maven不允許用戶在settings.xml的profile中聲明依賴或者插件,事實(shí)上,在pom.xml外部的profile只能夠聲明如下的幾個(gè)元素:

<project>
  <repositories></repositories>
  <pluginRepositories></pluginRepositories>
  <properties></properties>
</project>

現(xiàn)在不用擔(dān)心POM外部的profile會(huì)對項(xiàng)目產(chǎn)生太大的影響了,事實(shí)上這樣的profile僅僅能用來影響到項(xiàng)目的倉庫和Maven屬性。

profile的使用

Web資源過濾:Web項(xiàng)目中除了上述我們提到的src/main/resource/文件下的資源文件,還有另外一類資源文件,默認(rèn)他們的源碼位于src/main/webapp/目錄,經(jīng)打包后位于項(xiàng)目的WAR包的根目錄。如css、js文件中的資源,如果需要針對不同用戶使用不同的css,只需要配置不同的profile,在maven-war-plugin對src/main/webapp這一Web資源目錄開啟過濾,按用戶需要的css文件選擇對應(yīng)的profile進(jìn)行激活即可。

在Profile激活集成測試:可以配置Maven默認(rèn)只會(huì)執(zhí)行單元測試,如果想要執(zhí)行集成測試,就需要激活對應(yīng)的profile文件才行。由此可見,profile不僅可以用來應(yīng)對不同的構(gòu)建環(huán)境以保持構(gòu)建的可移植性,還可以用來分離構(gòu)建的一些較耗時(shí)或者耗資源的行為,并給予更合適的構(gòu)建頻率。


文章僅供參考,代碼并不是全正確,只需要知道在對應(yīng)的情況,可以做對應(yīng)的處理,代碼是變化的,我相信原理不變


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容