1. 前言
Maven is - at its heart - a plugin execution framework; all work is done by plugins.
maven實(shí)際上一個(gè)插件執(zhí)行框架提鸟,所有的工作實(shí)際上都是通過(guò)插件完成,一個(gè)插件通常提供若干目標(biāo)(goal),通過(guò)如下形式的命令執(zhí)行插件目標(biāo):
mvn [plugin name]:[goal name]
例如可以通過(guò)編譯插件compiler去編譯目標(biāo),命令如下:
mvn compiler:compile
插件類型
插件有兩類:
插件類型 | 解釋 |
---|---|
build plugins | build項(xiàng)目時(shí)期執(zhí)行這類插件,且這類插件必須配置在pom的<build></build>中 |
report plugins | mvn site期間執(zhí)行的插件上沐,用于生成項(xiàng)目報(bào)表文檔之類的,需要配置在pom的<reporting></reporting>之間 |
由于我從來(lái)沒(méi)有用過(guò)report plugin,所以本文只會(huì)講build plugins赋朦。
2. 生命周期
maven是一種基于構(gòu)建生命周期(build lifecycle)的項(xiàng)目構(gòu)建工具, 也就是說(shuō)一個(gè)項(xiàng)目的構(gòu)建和發(fā)布是要經(jīng)歷幾個(gè)過(guò)程的,目前主要包含三個(gè)過(guò)程:
- clean
- default
- site
這其中每一個(gè)過(guò)程又有若干個(gè)階段(phase)組成。下面列表只是簡(jiǎn)單列出了開(kāi)發(fā)者比較常見(jiàn)的phase:
1. clean
phase | 解釋 |
---|---|
clean | 起初之前一起build生成的文件 |
2. default
phase | 解釋 |
---|---|
validate | 對(duì)項(xiàng)目的必要信息或資源進(jìn)行驗(yàn)證 |
initialize | 初始化操作宠哄,比如常見(jiàn)目錄壹将,設(shè)置屬性 |
compile | 編譯源文件 |
test | 使用測(cè)試框架跑所有測(cè)試用例 |
package | 打包項(xiàng)目 |
install | 部署到本地repository |
deploy | 發(fā)布到遠(yuǎn)程倉(cāng)庫(kù) |
phase | 解釋 |
---|---|
site | 生成項(xiàng)目文檔的網(wǎng)頁(yè)資源 |
3. site
phase | 解釋 |
---|---|
site | 生成項(xiàng)目文檔的網(wǎng)頁(yè)資源 |
使用過(guò)mvn的就會(huì)發(fā)現(xiàn),一個(gè)phase對(duì)應(yīng)一個(gè)mvn的命令毛嫉,比如當(dāng)執(zhí)行mvn compile
命令時(shí)就是執(zhí)行該phase之前的所有phase诽俯。
但是前言中說(shuō)過(guò)mvn是通過(guò)插件來(lái)執(zhí)行任務(wù)的,當(dāng)執(zhí)行mvn compile
這個(gè)phase時(shí)承粤,實(shí)際上是執(zhí)行綁定在compile這個(gè)phase上的插件目標(biāo)暴区,由于compile這個(gè)phase默認(rèn)綁定了compiler: compile
(compiler插件的compile目標(biāo)),因此執(zhí)行mvn compile
等于去執(zhí)行了mvn compiler:compile
再例如:執(zhí)行mvn package
實(shí)際上執(zhí)行了插件mvn jar:jar
(注意此處假設(shè)pom里配置了<packaging>jar<package>), 因?yàn)閜ackage這個(gè)phase默認(rèn)綁定了jar:jar
這個(gè)插件目標(biāo)。
附:
這一節(jié)只是簡(jiǎn)單介紹了插件構(gòu)建的生命周期一個(gè)辛臊,省略了一些內(nèi)容仙粱,更多的細(xì)節(jié)請(qǐng)參考官方文檔介紹mvn 生命周期
3. 插件配置
本文只介紹build plugin, build plugin需要寫(xiě)在pom文件的<build></build>
中,
一個(gè)插件通常包含如下配置:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<extensions>false</extensions>
<inherited>true</inherited>
<configuration>
<classifier>test</classifier>
</configuration>
<dependencies>...</dependencies>
<executions>...</executions>
</plugin>
</plugins>
</build>
</project>
- 一個(gè)<plugin></plugin>表示一個(gè)插件彻舰, <groupId>,<artifactId>,<version>都是引入必要配置伐割。插件本質(zhì)上托管在mvn倉(cāng)庫(kù)里。
- <inherited>表示是否當(dāng)前pom的子pom中繼承這個(gè)插件配置刃唤,true表示子pom繼承父pom這個(gè)插件配置隔心,那么你就可以在子pom上通過(guò)mvn命令使用這個(gè)插件
- <configuration>中包含了插件類實(shí)例化時(shí)用于初始化類成員信息
- <dependencies>, 插件自身也會(huì)依賴外部包,<dependencies>中可以為插件指定特定的依賴包尚胞, 引入方式如下:
<dependencies> <dependency> <groupId>...</groupId> <artifactId>...</artifactId> <version>...</version> </dependency> </dependencies>
- <executions>, 一個(gè)插件可能包含多個(gè)goal济炎,<executions>中可以單獨(dú)為某個(gè)goal指定配置,以及將goal綁定到某個(gè)phase辐真。executions包含的elements如下:
<executions> <execution> <!--需要在<executions>里面唯一的id--> <id></id> <!--列出需要特定去配置的所有g(shù)oal--> <goals> <goal>run</goal> </goals> <!--將這些goal綁定到phase--> <phase>verify</phase> <!--指定子pom是否繼承這些配置--> <inherited>false</inherited> <configuration> <!--這里指定配置--> </configuration> </execution> <execution> ... </execution> ... </executions>
一個(gè)示例
比如下面就是一個(gè)幾乎所有人都會(huì)用到的插件配置须尚,compiler:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version> <!--指定compiler插件版本信息-->
<configuration>
<!--插件實(shí)例化參數(shù),這個(gè)參數(shù)是設(shè)置javac -source的值-->
<source>1.7</source>
<!--插件實(shí)例化參數(shù)侍咱,這個(gè)參數(shù)是設(shè)置javac -target的值-->
<target>1.7</target>
</configuration>
</plugin>
這里沒(méi)有指定<executions>耐床,因?yàn)閏ompiler插件的目標(biāo)compile默認(rèn)被綁定到compile這個(gè)phase上了,
目標(biāo)testCompile被綁定到了test-compile這個(gè)phase上了楔脯。
當(dāng)然你可以顯式指定撩轰,加入如下配置即可:
<executions>
<execution>
<id>compile</id>
<goals>
<goal>compile</goal>
</goals>
<phase>compile</phase>
</execution>
<execution>
<id>testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
所以當(dāng)執(zhí)行mvn compile
時(shí)其實(shí)執(zhí)行了插件目標(biāo)mvn compiler:compile
,執(zhí)行mvn test-compile
時(shí)執(zhí)行了插件目標(biāo)mvn compiler:testCompile
.
附
- 關(guān)于插件參數(shù)配置參考guide-configuring-plugins
- 關(guān)于pom中使用插件參考plugins in pom
- 關(guān)于maven插件列表參考available plugins