今天無(wú)意中刺激到我啦水醋,這促使我發(fā)現(xiàn)自己還不夠強(qiáng)大旗笔,我需要不斷充實(shí)自己,擴(kuò)充自己的實(shí)力拄踪,加油吧蝇恶,騷年!;掏撮弧!
今天我要講的是maven靈活構(gòu)建相關(guān)的知識(shí),請(qǐng)做好準(zhǔn)備姚糊,知識(shí)點(diǎn)有點(diǎn)多哦~~~
maven屬性
首先帶來(lái)的是maven
的屬性知識(shí)贿衍,在maven
中一共有6大屬性,分別為:
內(nèi)置屬性
basedir
項(xiàng)目pom
文件所在地址
version
項(xiàng)目版本
使用方式為直接使用${basedir}
的方式進(jìn)行引用
pom屬性
可以使用該類(lèi)屬性引用pom
文件中的配置救恨,因?yàn)?code>pom文件根元素為project
,所以使用時(shí)通過(guò)${project.version}
,${project.groupId}
的方式引用
settings屬性
可以使用該類(lèi)屬性引用settings
文件中的配置贸辈,前面已經(jīng)提到,我們推薦在用戶(hù)目錄下使用該settings.xml
文件肠槽,比如我在windows
系統(tǒng)中該文件位置為:C:\Users\Administrator\.m2\settings.xml,settings.xml
中根元素為settings
,所以引用需要通過(guò)${settings.localRepository}
的方式
自定義屬性
這也許是我們最常用的一種屬性了擎淤,在pom
文件的properties
中定義我們想要引用的屬性,然后再通過(guò)${property_name}
的方式引用秸仙,比如
<project>
<properties>
<spring.version>3.2.0</spring.version>
</properties>
</project>
通過(guò)${spring.version}
方式引用
java系統(tǒng)屬性
這種屬性可以通過(guò)在控制臺(tái)中輸入mvn help:system
的方式查詢(xún)當(dāng)前系統(tǒng)中存在的系統(tǒng)屬性嘴拢,通過(guò)${prop_name}
的方式引用,比如${file.encoding.pkg}
環(huán)境變量屬性
環(huán)境變量屬性也可以通過(guò)mvn help:system
的方式查看寂纪,引用的方式通過(guò)${env.varname}
的方式引用
使用這些屬性可以幫我們?cè)谝肽K時(shí)簡(jiǎn)化維護(hù)和配置的工作
管理多模塊依賴(lài)
groupId
,version
都是相同的席吴,這時(shí)可以通過(guò)pom
屬性將groupId
,versionId
進(jìn)行簡(jiǎn)化
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>account-service</artifactId>
<version>${project.version}</version>
</dependency>
管理項(xiàng)目依賴(lài)
依賴(lài)某一個(gè)模塊,比如spring
一系列的jar
包時(shí),他們的version
其實(shí)是一樣的抢腐,所以我們也可以通過(guò)自定義屬性定義spring.version
屬性姑曙,將版本號(hào)抽離出來(lái)放入<properties>
標(biāo)簽中然后進(jìn)行引用
配置插件
大量插件也用到了屬性襟交,比如maven-surefire-plugin
中的reportsDirectory
我們可以通過(guò)pom
屬性修改報(bào)告的位置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<reportsDirectory>${project.build.directory}/test-reports/</reportsDirectory>
</configuration>
</plugin>
構(gòu)建環(huán)境的差異
在不同的環(huán)境中迈倍,項(xiàng)目的源碼應(yīng)該會(huì)用不同的方式進(jìn)行構(gòu)建,比如數(shù)據(jù)庫(kù)的配置捣域,在測(cè)試啼染、開(kāi)發(fā)、正式這三個(gè)不同的環(huán)境下是不會(huì)一樣的焕梅,按照傳統(tǒng)的方式迹鹅,在src/main/resources
下放置有配置文件jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
其中包含了數(shù)據(jù)庫(kù)連接的配置信息,當(dāng)在不同的環(huán)境中時(shí)贞言,手工修改這個(gè)數(shù)據(jù)庫(kù)配置斜棚,然后再構(gòu)建,但這種方式是非常麻煩笨拙的
資源過(guò)濾(命令行)
為了解決上面的變化该窗,maven
提供了一種解決方式弟蚀,通過(guò)profile
隔離環(huán)境的變化
首先將jdbc.properties
變化的配置抽離出來(lái)
jdbc.driverClassName=${jdbc.driverClassName}
jdbc.url=${jdbc.url}
jdbc.username=${jdbc.username}
jdbc.password=${jdbc.password}
通過(guò)maven
屬性與profile
結(jié)合的方式配置不同環(huán)境的特有屬性
<profiles>
<profile>
<id>dev</id>
<properties>
<jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName/>
<jdbc.url>jdbc:mysql://localhost:3306/test</jdbc.url>
<jdbc.username>root</jdbc.username>
<jdbc.password>root</jdbc.password>
</properties>
</profile>
</profiles>
我們知道,對(duì)于maven
的屬性酗失,只能在pom
文件中使用义钉,那么在資源配置文件jdbc.properties
中是無(wú)法訪問(wèn)的,為了讓其能夠訪問(wèn)到屬性规肴,我們需要使用maven-resources-plugin
做一些配置:
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
通過(guò)directory
指定資源配置文件所在的目錄捶闸,并通過(guò)filtering=true
表示當(dāng)前目錄下的資源文件都需要進(jìn)行過(guò)濾,也就是其中配置的屬性引用需要被pom
屬性值替換
配置完之后拖刃。我們可以通過(guò)命令行mvn clean install -Pdev
的方式運(yùn)行删壮,完成后輸出目錄中的數(shù)據(jù)庫(kù)配置就被dev
中的屬性替換掉了
maven profile
上面提到,我們可以通過(guò)profile
來(lái)隔離不同環(huán)境的屬性變化兑牡,然后通過(guò)命令行-PprofileId
的方式激活profile
,對(duì)于profile
的激活央碟,還可以有其他幾種方式
profile激活
命令行激活方式
mvn
命令行參數(shù)-P
加上profileId
來(lái)激活profile
,多個(gè)profile
用逗號(hào)隔開(kāi)
mvn clean install -Pdev-x,dev-y
,這里將會(huì)激活dev-x,dev-y
的配置信息
settings文件顯示激活
如果希望某一配置默認(rèn)一直處于激活狀態(tài)发绢,就可以配置settings.xml
文件中的activeProfiles
元素硬耍,它表示配置的profile
對(duì)所有項(xiàng)目都處于激活狀態(tài)
<settings>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
系統(tǒng)屬性激活
可以用當(dāng)某一個(gè)系統(tǒng)屬性存在的時(shí)候自動(dòng)激活profile
<profiles>
<profile>
<activation>
<property>
<name>test</name>
</property>
</activation>
...
</profile>
</profiles>
可以進(jìn)一步精確,當(dāng)存在屬性test
边酒,且值為x
時(shí)激活profile
<profiles>
<profile>
<activation>
<property>
<name>test</name>
<value>x</value>
</property>
</activation>
...
</profile>
</profiles>
我們可以通過(guò)命令行聲明系統(tǒng)屬性经柴,所以我們可以通過(guò)
mvn clean install -Dtest=x
的方式從命令行激活profile
操作系統(tǒng)環(huán)境激活
<profiles>
<profile>
<activation>
<os>
<name>Windows 10</name>
<family>Windows</family>
<arch>amd64</arch>
<version>10.0</version>
</os>
</activation>
</profile>
</profiles>
family
包括Windows
,UNIX
,Mac
等,其他幾項(xiàng)name
,arch
,version
可以通過(guò)mvn help:system
方式查看os.
開(kāi)頭的系統(tǒng)屬性墩朦,這里分別對(duì)應(yīng)os.name
,os.arch
,os.version
文件是否存在激活
<profiles>
<profile>
<activation>
<file>
<missing>x.properties</missing>
<exists>y.properties</exists>
</file>
</activation>
...
</profile>
</profiles>
存在y.properties
,且不存在x.properties
時(shí)激活profile
默認(rèn)激活(開(kāi)發(fā)中用的最多)
用戶(hù)可以在配置profile
時(shí)指定默認(rèn)激活
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
不過(guò)需要注意的是坯认,如果有任何一個(gè)profile
通過(guò)其他以上任意一種方式被激活了,那么當(dāng)前的默認(rèn)激活配置就會(huì)失效
如果項(xiàng)目中配置了多種激活方式,那么我們可以通過(guò)maven-help-plugin
查看
查看當(dāng)前已激活的配置
mvn help:active-profiles
列出當(dāng)前所有profile
mvn help:all-profiles
profile的種類(lèi)
根據(jù)需要牛哺,用戶(hù)可以將profile
配置到:
pom.xml 只對(duì)當(dāng)前項(xiàng)目有效
用戶(hù)settings.xml 對(duì)本機(jī)該用戶(hù)所有項(xiàng)目有效
全局settings.xml 安裝maven
目錄下的conf/settings.xml
中的profile
對(duì)本機(jī)所有用戶(hù)的所有項(xiàng)目有效
在profile
中可以使用的pom
元素
<project>
<repositories></repositories>
<pluginRepositories></pluginRepositories>
<distributionManagement></distributionManagement>
<dependencies></dependencies>
<dependencyMangement></dependencyManagement>
<modules></modules>
<properties></properties>
<reporting></reporting>
<build>
<plugins></plugins>
<defaultGoal></defaultGoal>
<resources></resources>
<testResources></testResources>
<finalName></finalName>
</build>
</project>
web資源過(guò)濾
與普通的配置文件一樣陋气,web
資源(src/main/webapps/
下的資源文件css/js/img
等)也不能使用pom
屬性,需要通過(guò)maven-war-plugin
進(jìn)行配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<webResources>
<resource>
<filtering>true</filtering>
<directory>src/main/webapp</directory>
<includes>
<include>**/*.css</include>
<include>**/*.js</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
通過(guò)directory
聲明web
資源目錄src/main/webapp
(這也是默認(rèn)的web
資源目錄)引润,然后配置filtering
開(kāi)啟過(guò)濾巩趁,并使用includes
指定要過(guò)濾的文件,這里指定所有的js
,css
都需要進(jìn)行過(guò)濾
在工作中的使用
我們需要根據(jù)不同環(huán)境配置不同的參數(shù)淳附,就拿數(shù)據(jù)庫(kù)配置為例议慰,account-web
表示項(xiàng)目名
我們需要在account-web
下建立不同環(huán)境的配置文件,用于分離環(huán)境參數(shù)配置
dev.properties
的配置如下奴曙,其他環(huán)境比如test
别凹,production
環(huán)境可能需要配置不同的數(shù)據(jù)庫(kù)連接方式
jdbc.username=root
jdbc.password=root
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/account?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
在pom
中指定三種不同環(huán)境的profile
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<env>production</env>
</properties>
</profile>
</profiles>
<build>
<filters>
<filter>${basedir}/config/${env}.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.xsd</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
這里需要注意使用includes
表示構(gòu)建時(shí)需要將那些資源文件納入構(gòu)建中,這里需要指定所有需要用到的資源文件洽糟,否則在目標(biāo)構(gòu)建中將不會(huì)包含include
之外的配置文件
如此在運(yùn)行maven
命令進(jìn)行打包時(shí)就會(huì)使用激活的profile
對(duì)應(yīng)的配置替換其中變量
好啦炉菲,今天就講到這里,剛好00:00坤溃,還有其他事情要做拍霜,今天就到這里吧~~~