所有項(xiàng)目的構(gòu)建都是有生命周期的,這個(gè)生命周期包括:項(xiàng)目清理擂橘、初始化毒涧、編譯、測(cè)試贝室、打包、集成測(cè)試仿吞、驗(yàn)證滑频、部署、站點(diǎn)生成等幾乎所有的構(gòu)建步驟唤冈。就像人的生命周期都有出生峡迷、少年、青年、壯年绘搞、老年彤避、死亡這些階段,而在這些階段我們都可以做不同的事情夯辖,比如青年階段就可以結(jié)婚了琉预。
Maven作為項(xiàng)目構(gòu)建工具,它也具有這樣的生命周期蒿褂。比如執(zhí)行mvn package就表示執(zhí)行默認(rèn)生命周期階段package圆米。maven的生命周期是抽象的,生命周期中包含多個(gè)有次序的階段啄栓,每個(gè)階段都可能會(huì)執(zhí)行多個(gè)行為娄帖,而實(shí)際行為都是由插件來(lái)完成的,如package階段的任務(wù)可能就是由maven-jar-plugin插件完成昙楚,在maven中生命周期和插件兩者協(xié)同工作近速,密不可分。
1Maven生命周期設(shè)計(jì)思想(模板方法模式)
- Maven的生命周期是抽象的堪旧,這意味著生命周期本身不做任何實(shí)際工作削葱,在maven的設(shè)計(jì)中,實(shí)際的任務(wù)(如編譯源代碼)都交由插件來(lái)完成崎场。這種設(shè)計(jì)思想如設(shè)計(jì)模式中的模板方法相似佩耳。
- 模板方法模式在父類(lèi)中定義算法的整體結(jié)構(gòu),子類(lèi)可以通過(guò)實(shí)現(xiàn)或者重寫(xiě)父類(lèi)的方法來(lái)控制實(shí)際的行為谭跨,這樣既保證了算法有足夠的可擴(kuò)展性干厚,又嚴(yán)格控制算法的整體結(jié)構(gòu),如下模板方法抽象類(lèi)能夠很好地體現(xiàn)Maven聲明周期概念:
package com.cnu.offline.template.method;
public abstract class AbstractBuild {
/**
* 項(xiàng)目構(gòu)建
*/
public void build(){
initialize();
compile();
test();
packagee();
integrationTest();
deploy();
}
protected abstract void initialize();
protected abstract void compile();
protected abstract void test() ;
protected abstract void packagee();
protected abstract void integrationTest();
protected abstract void deploy();
}
- 這段代碼非常簡(jiǎn)單螃宙,build()方法定義了整個(gè)構(gòu)建過(guò)程蛮瞄,依次初始化、編譯谆扎、測(cè)試挂捅、打包、集成測(cè)試堂湖、部署行為闲先,它們都交由子類(lèi)去實(shí)現(xiàn)。上述代碼和maven雖然相差甚遠(yuǎn)无蜂,但是這種思想和maven很相似伺糠。
- maven的生命周期更多更復(fù)雜。maven聲明周期抽象了構(gòu)建的各個(gè)步驟斥季,定義了次序训桶,但是沒(méi)有提供具體實(shí)現(xiàn)累驮,那么誰(shuí)來(lái)實(shí)現(xiàn)呢?插件舵揭。生命周期的每個(gè)階段都可以綁定一個(gè)或者多個(gè)插件行為谤专,而且maven為大多數(shù)構(gòu)建步驟綁定了默認(rèn)的插件。比如:針對(duì)編譯的插件有maven-compileer-plugin午绳,針對(duì)測(cè)試的插件有maven-surefire-plugin等置侍。
- maven的生命周期和插件機(jī)制一方面保證了所有maven項(xiàng)目都有一致的構(gòu)建標(biāo)準(zhǔn)(步驟)。另一方面有通過(guò)默認(rèn)插件簡(jiǎn)化和穩(wěn)定了實(shí)際項(xiàng)目的構(gòu)建箱叁,此外墅垮,該機(jī)制還提供了足夠的擴(kuò)展空間,用戶(hù)可以通過(guò)配置現(xiàn)有插件或者自行編寫(xiě)插件來(lái)完成自定義構(gòu)建行為耕漱。
2生命周期詳解
2.1三套生命周期
- 項(xiàng)目構(gòu)建的生命周期一般包括:項(xiàng)目清理算色、初始化、編譯螟够、測(cè)試灾梦、打包、集成測(cè)試妓笙、驗(yàn)證若河、部署、站點(diǎn)生成等階段寞宫,但是maven為了更方便構(gòu)建萧福,maven使用了3套相互獨(dú)立的生命周期來(lái)包含這些階段,名稱(chēng)分別為:clean辈赋、default鲫忍、site。clean生命周期的目的是清理項(xiàng)目钥屈,default生命周期目的是構(gòu)建項(xiàng)目悟民,site生命周期是建立項(xiàng)目站點(diǎn)。3套生命周期相互獨(dú)立篷就。每套生命周期中各個(gè)階段都是由次序關(guān)系射亏,后面階段執(zhí)行前必須先執(zhí)行前面的階段,就像人在死亡前他必須經(jīng)歷出生竭业、少年智润、青年、壯年未辆、老年這些階段做鹰。
- 每個(gè)生命周期都包含多個(gè)階段,但是maven默認(rèn)不是在所有階段上都綁定了插件行為鼎姐,只是在關(guān)鍵的周期階段綁定了插件行為,沒(méi)綁定插件行為的階段在構(gòu)建時(shí)就不會(huì)執(zhí)行
2.2clean生命周期
- clean生命周期的目的是清理項(xiàng)目,包含階段:
- 1 pre-clean 執(zhí)行一些清理前需要完成的工作炕桨。
- 2 clean(綁定默認(rèn)插件目標(biāo)maven-clean-plugin:clean) 清理上一次構(gòu)建生成的文件(target/目錄)
- 3 post-clean 執(zhí)行一些清理后需要完成的工作饭尝。
2.3default生命周期
default生命周期定義了真正構(gòu)建時(shí)所需要執(zhí)行的所有步驟,最核心生命周期献宫。包含階段钥平,默認(rèn)綁定的插件與打包類(lèi)型packaging有關(guān),下面以jar為例:
1.validate:validate the project is correct and all necessary information is available.
2.initialize:initialize build state, e.g. set properties or create directories.
3.generate-sources:generate any source code for inclusion in compilation.
4.process-sources :process the source code, for example to filter any values.
5.genrate-resources:generate resources for inclusion in the package.
6.process-resources(綁定默認(rèn)插件目標(biāo)maven-resources-plugin:resources)處理項(xiàng)目主資源文件姊途,一般來(lái)說(shuō)涉瘾,是對(duì)src/main/resources目錄的內(nèi)容進(jìn)行變量替換等工作后,然后復(fù)制到項(xiàng)目輸出的主classpath目錄中捷兰。
7.compile(綁定默認(rèn)插件目標(biāo)maven-compiler-plugin:compile)編譯項(xiàng)目的主源碼立叛,編譯src/main/java目錄下的Java文件至項(xiàng)目輸出的主classpath目錄中。
8.process-classes:post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
9.generate-test-sources:generate any test source code for inclusion in compilation.
10.process-test-sources:process the test source code, for example to filter any values.
11.generate-test-resources:create resources for testing.
12.process-test-resources(綁定默認(rèn)插件目標(biāo)maven-resources-plugin:testResources)處理項(xiàng)目測(cè)試資源文件贡茅,一般來(lái)說(shuō)秘蛇,是對(duì)src/test/resources目錄的內(nèi)容進(jìn)行變量替換等工作后,然后復(fù)制到項(xiàng)目輸出的測(cè)試classpath目錄中顶考。
13.test-compile(綁定默認(rèn)插件目標(biāo)maven-compiler-plugin:testCompile)編譯項(xiàng)目的測(cè)試代碼赁还。一般來(lái)說(shuō),是編譯src/test/java目錄下的Java文件至項(xiàng)目輸出的測(cè)試classpath目錄中驹沿。
14.process-test-classes:post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. For Maven 2.0.5 and above.
15.test(綁定默認(rèn)插件目標(biāo)maven-surefire-plugin:test)使用單元測(cè)試框架運(yùn)行測(cè)試艘策,測(cè)試代碼不會(huì)被打包部署。
16.prepare-package:perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. (Maven 2.1 and above)
17.package(綁定默認(rèn)插件目標(biāo)maven-jar-plugin:jar)接受編譯好的代碼渊季,打包成可發(fā)布的格式朋蔫,如JAR
18.pre-integraton-test:perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
19.integration-test:process and deploy the package if necessary into an environment where integration tests can be run.
20.post-integration-test: perform actions required after integration tests have been executed. This may including cleaning up the environment.
21.verify:run any checks to verify the package is valid and meets quality criteria.
22.install(綁定默認(rèn)插件目標(biāo)maven-install-plugin:install)將包安裝到Maven倉(cāng)庫(kù),供本地項(xiàng)目使用
23.deploy(綁定默認(rèn)插件目標(biāo)maven-deploy-plugin:deploy)將最終的包復(fù)制到遠(yuǎn)程倉(cāng)庫(kù)梭域,供其他開(kāi)發(fā)人員和maven項(xiàng)目使用斑举。部署至遠(yuǎn)程倉(cāng)庫(kù)配置
執(zhí)行mvn命令到某一個(gè)生命周期
mvn clean test-compile
2.4site生命周期
- site生命周期是建立和發(fā)布項(xiàng)目站點(diǎn),maven能夠基于POM所包含的信息自動(dòng)生成一個(gè)友好的站點(diǎn)病涨,方便團(tuán)隊(duì)交流和發(fā)布項(xiàng)目信息富玷。
- 1.pre-site : execute processes needed prior to the actual project site generation
- 2.site :(綁定默認(rèn)插件目標(biāo)maven-site-plugin:site) generate the project's site documentation
- 3.post-site :execute processes needed to finalize the site generation, and to prepare for site deployment
- 4.site-deploy:(綁定默認(rèn)插件目標(biāo)maven-site-plugin:deploy) deploy the generated site documentation to the specified web server
2.5命令行與生命周期
從命令行執(zhí)行Maven任務(wù)最主要的方式就是調(diào)用Maven聲明周期階段。
$mvn clean:該命令調(diào)用clean生命周期的clean階段既穆,實(shí)際執(zhí)行的階段為clean生命周期的pre-clean 和clean階段
$mvn clean deploy site-deploy:該命令調(diào)用clean生命周期的clean階段赎懦、default周期的deploy階段、site生命周期的site-deploy階段幻工。實(shí)際執(zhí)行clean生命周期pre-clean,clean 階段励两,default生命周期所有階段,site生命周期所有階段囊颅。
執(zhí)行mvn clean install所執(zhí)行的任務(wù)当悔。
E:\Repository\iqasproject\iqasweb>mvn clean install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building iqasweb Maven Webapp 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ iqasweb ---
[INFO] Deleting E:\Repository\iqasproject\iqasweb\target
[INFO]
[INFO] --- maven-resources-plugin:2.7:resources (default-resources) @ iqasweb --
-
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 14 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.3:compile (default-compile) @ iqasweb ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 388 source files to E:\Repository\iqasproject\iqasweb\target\cl
asses
[INFO]
[INFO] --- maven-resources-plugin:2.7:testResources (default-testResources) @ iq
asweb ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:\Repository\iqasproject\iqasweb\src
\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.3:testCompile (default-testCompile) @ iqasweb
---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 8 source files to E:\Repository\iqasproject\iqasweb\target\test
-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.19:test (default-test) @ iqasweb ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-war-plugin:2.1.1:war (default-war) @ iqasweb ---
[INFO] Packaging webapp
[INFO] Assembling webapp [iqasweb] in [E:\Repository\iqasproject\iqasweb\target\
iqasweb]
[INFO] Processing war project
[INFO] Copying webapp resources [E:\Repository\iqasproject\iqasweb\src\main\weba
pp]
[INFO] Webapp assembled in [7681 msecs]
[INFO] Building war: E:\Repository\iqasproject\iqasweb\target\iqasweb.war
[WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ig
nored
(webxml attribute is missing from war task, or ignoreWebxml attribute is specifi
ed as 'true')
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ iqasweb ---
[INFO] Installing E:\Repository\iqasproject\iqasweb\target\iqasweb.war to D:\Sof
t\maven\maven_jar\repository\com\cnu\iqas\iqasweb\0.0.1-SNAPSHOT\iqasweb-0.0.1-S
NAPSHOT.war
[INFO] Installing E:\Repository\iqasproject\iqasweb\pom.xml to D:\Soft\maven\mav
en_jar\repository\com\cnu\iqas\iqasweb\0.0.1-SNAPSHOT\iqasweb-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
3插件目標(biāo)
- Maven的核心僅僅定義了抽象生命周期傅瞻,具體工作由插件完成,對(duì)于插件本身盲憎,為了能夠?qū)崿F(xiàn)代碼復(fù)用嗅骄,它往往能完成多個(gè)任務(wù),也就具有多個(gè)功能饼疙,這些功能聚集在一個(gè)插件中溺森,每個(gè)功能就叫做一個(gè)插件目標(biāo)。
- maven-dependency-plugin插件有十多個(gè)目標(biāo)窑眯,每個(gè)目標(biāo)對(duì)應(yīng)一個(gè)功能屏积,目標(biāo)有:dependency:analyze、dependency:tree磅甩、dependency:list炊林。這是一種通用寫(xiě)法,冒號(hào)前面是插件前綴更胖,后面是插件目標(biāo)
4插件綁定
我們把插件的目標(biāo)綁定到maven生命周期的某個(gè)階段用于完成實(shí)際任務(wù)铛铁,叫做插件綁定。例如:maven-compiler-plugin這一插件的compile目標(biāo)能夠完成項(xiàng)目編譯這一任務(wù)却妨,因此就把該目標(biāo)綁定到default生命周期的compile這一階段饵逐。
4.1內(nèi)置綁定
Maven在核心的生命周期階段綁定了很多插件的目標(biāo),當(dāng)用戶(hù)通過(guò)命令調(diào)用生命周期階段的時(shí)候?qū)?yīng)的插件目標(biāo)就會(huì)執(zhí)行相應(yīng)的任務(wù)彪标。
對(duì)于默認(rèn)的插件綁定在上面介紹3個(gè)生命周期時(shí)已經(jīng)有備注了倍权,下面對(duì)default生命周期的內(nèi)置插件綁定關(guān)系做一些說(shuō)明。
default生命周期與插件的綁定關(guān)系由打包類(lèi)型決定packaging捞烟,因?yàn)閖ar項(xiàng)目需要打包成JAR包薄声,war項(xiàng)目需要打包成war包,還有pom题画、maven-plugin默辨、ear等類(lèi)型。
default生命周期插件目標(biāo)綁定關(guān)系
4.2自定義綁定
除了內(nèi)置綁定外苍息,用戶(hù)還可以選擇將某個(gè)插件目標(biāo)綁定到生命周期的某個(gè)階段缩幸。
需求:創(chuàng)建項(xiàng)目源碼包
*內(nèi)置的插件沒(méi)有涉及這一任務(wù),需要自己配置竞思。
- 1.確定插件目標(biāo):
去哪里找插件表谊?基本上所有的插件插件都來(lái)源于Apache和Codehaus,
首先通過(guò)查看插件發(fā)現(xiàn)maven-source-plugin插件的jar-no-fork目標(biāo)能夠?qū)㈨?xiàng)目的主代碼(包括主資源)打包成jar文件盖喷, - 2.確定生命周期階段:
查看生命周期各階段介紹爆办,發(fā)現(xiàn)綁定到default生命周期的verify階段上,在執(zhí)行完集成測(cè)試后和安裝構(gòu)件之前創(chuàng)建源碼jar包课梳。 - 在pom.xml中配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>my-attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
解釋
groupId為org.apache.maven.plugins(maven官方插件)距辆,凡是gourpId為org.apache.maven.plugins可以省略(不推薦).
executions下每個(gè)execution元素可以用來(lái)配置執(zhí)行一個(gè)任務(wù)余佃,該例中配置一個(gè)id為my-attach-sources的任務(wù)。
通過(guò)phase將其綁定到verify生命周期階段上跨算。不配置phase也會(huì)執(zhí)行目標(biāo)(不推薦)咙冗,因?yàn)樵摬寮帉?xiě)時(shí)默認(rèn)階段是package,而package在install之前.
通過(guò)goals配置指定要執(zhí)行的插件目標(biāo)漂彤。
執(zhí)行mvn clean install,多了如下兩行,生成了源碼包iqasweb-sources.jar灾搏。
[INFO] --- maven-source-plugin:2.1.1:jar-no-fork (my-attach-sources) @ iqasweb ---
[INFO] Building jar: E:\Repository\iqasproject\iqasweb\target\iqasweb-sources.jar
- 多個(gè)目標(biāo)被綁定到同一目標(biāo)上時(shí)挫望,執(zhí)行順序安裝聲明先后執(zhí)行。
5插件配置
插件和生命周期綁定后狂窑,用戶(hù)可以配置插件和插件目標(biāo)的參數(shù)媳板,進(jìn)一步刁征插件目標(biāo)所執(zhí)行的任務(wù),以滿(mǎn)足項(xiàng)目需求泉哈,幾乎所有的Maven插件都有一些參數(shù)蛉幸。
用戶(hù)可以通過(guò)命令行或者POM來(lái)配置插件參數(shù),注意丛晦,命令行和POM配置的參數(shù)的名稱(chēng)一般都不一樣奕纫。就需要查看插件的信息,下面有介紹烫沙。
配置之前需要查看插件有哪些參數(shù)可以配置匹层,配置參數(shù)的意義。
5.1命令行插件配置
- 很多插件參數(shù)都支持命令行配置锌蓄。但不是所有升筏。
- 在Maven命令中使用-D參數(shù),并伴隨一個(gè)key=value的形式來(lái)配置插件目標(biāo)參數(shù)瘸爽。
案例
maven-surefire-plugin提供了一個(gè)maven.test.skip的命令行參數(shù)(在pom中參數(shù)為skip)您访,當(dāng)其值為true時(shí)會(huì)跳過(guò)執(zhí)行測(cè)試。
$mvn install -Dmaven.test.skip=true
5.2POM中插件全局配置
對(duì)于參數(shù)很少改變的配置應(yīng)該配置在pom中剪决。
對(duì)插件的配置有全局配置和對(duì)插件目標(biāo)的配置灵汪。全局配置就是所有基于該插件目標(biāo)的任務(wù),都會(huì)使用這些配置昼捍。對(duì)插件目標(biāo)配置就只是對(duì)該目標(biāo)的任務(wù)執(zhí)行該配置识虚。
案例
- 配置maven-compiler-plugin告訴它編譯java1.7版本的源文件,生成與JVM1.7兼容的字節(jié)碼文件妒茬。
- 配置之前查看插件有哪些全局配置參數(shù)參數(shù)配置担锤。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<!-- if you want to use the Java 8 language features (-source 1.8) and also want the compiled classes to be compatible with JVM 1.8 (-target 1.8), -->
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
- 全局配置在plugin下面的configuration
- 這樣不管綁定到compile階段的maven-compiler-plugin:compile任務(wù),還是綁定到testCompiler階段maven-compiler-plugin:testCompiler任務(wù)乍钻,就都是用該配置肛循。
5.3POM中插件任務(wù)配置
- 為插件的某個(gè)目標(biāo)配置參數(shù)铭腕,配置在plugin/executions/execution下面的configuration
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<executions>
<execution>
<id>my-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</execution>
</executions>
</plugin>
6獲取插件信息
去哪里尋找合適的插件?多糠,詳細(xì)了解插件的配置點(diǎn)累舷?
maven插件很多,大部分沒(méi)有完善的文檔夹孔,一般maven官方的插件文檔比較完善一點(diǎn)被盈。
獲取插件信息有兩種,取網(wǎng)站上查看插件信息搭伤,如果網(wǎng)站信息沒(méi)有只怎,就通過(guò)調(diào)用命令行來(lái)獲取插件的描述信息。
6.1在線(xiàn)插件信息
-
以maven官方插件查看為例身堡。查看maven-surefire-plugin為例。如下圖:
maven-surefire-plugin插件官方介紹
一般來(lái)說(shuō)拍鲤,通過(guò)閱讀插件文檔中的使用介紹和實(shí)例就可以很好的使用插件了贴谎,如果想要了解目標(biāo)參數(shù),就需要訪(fǎng)問(wèn)插件的每個(gè)目標(biāo)的文檔季稳。
6.2使用maven-help-plugin描述插件
- maven-help-plugin插件的describe目標(biāo)可以查看插件的詳細(xì)信息擅这。更多目標(biāo)
- 用-D參數(shù),并伴隨一個(gè)key=value的形式來(lái)配置查詢(xún)參數(shù)绞幌。
常見(jiàn)使用方法
案例:查看maven-compiler-plugin的信息
方法1:
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1
Name: Maven Compiler Plugin
Description: The Compiler Plugin is used to compile the sources of your
project.
Group Id: org.apache.maven.plugins
Artifact Id: maven-compiler-plugin
Version: 2.1
Goal Prefix: compiler
This plugin has 3 goals:
compiler:compile
Description: Compiles application sources
compiler:help
Description: Display help information on maven-compiler-plugin.
Call
mvn compiler:help -Ddetail=true -Dgoal=<goal-name>
to display parameter details.
compiler:testCompile
Description: Compiles application test sources.
方法2:
使用前綴蕾哟,maven-compiler-plugin的前綴為compiler,在描述插件時(shí)可以省略版本信息莲蜘,maven就會(huì)獲取最新版的進(jìn)行表達(dá):
mvn help:describe -Dplugin=compiler
方法3:
如果想輸出更詳細(xì)信息谭确,包括插件每個(gè)目標(biāo)的參數(shù),加上detail
mvn help:describe -Dplugin=compiler -Ddetail.
7從命令行調(diào)用插件
如果在命令行運(yùn)行mvn -h來(lái)顯示mvn命令幫助票渠,就可以看到如下信息:告訴了mvn命令的基本用法
usage: mvn [options] [<goal(s)>] [<phase(s)>]
- options:表示可用的選項(xiàng)逐哈,mvn有20多個(gè)。如 mvn -v
- phase生命周期階段,如 mvn clean install
- goal插件目標(biāo)问顷,支持直接從命令行調(diào)用插件目標(biāo)昂秃。因?yàn)橛行┤蝿?wù)不適合綁定在生命周期上,如maven-help-plugin:describe杜窄,我們不需要再構(gòu)建項(xiàng)目的時(shí)候去顯示依賴(lài)樹(shù)肠骆。
- 調(diào)用案例如:mvn dependency:tree
mvn help:describe -Dplugin=compiler
help是maven-help-plugin插件的前綴。
- 調(diào)用案例如:mvn dependency:tree
8插件解析機(jī)制
8.1插件倉(cāng)庫(kù)
- 與依賴(lài)構(gòu)件一樣塞耕,插件構(gòu)件同樣基于坐標(biāo)存在于Maven倉(cāng)庫(kù)中蚀腿,需要時(shí)從本地倉(cāng)庫(kù)尋找,不存在,從遠(yuǎn)程倉(cāng)庫(kù)下載到本地使用莉钙。
- 插件倉(cāng)庫(kù)使用pluginRepositories和pluginRepository配置廓脆,和依賴(lài)的中央倉(cāng)庫(kù)類(lèi)似,Maven在超級(jí)POM中同樣內(nèi)置了插件遠(yuǎn)程倉(cāng)庫(kù)配置:
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
- 當(dāng)然maven配置的中央插件倉(cāng)庫(kù)已經(jīng)能滿(mǎn)足我們需求磁玉,但是如果使用的插件找不到停忿,也可以配置其它,在POM中或者settings.xml(在settings.xml配置在nexus私服中介紹)中加入其它插件倉(cāng)庫(kù)配置蚊伞。
8.2插件的默認(rèn)groupId
- 在pom中配置插件時(shí)席赂,如果該插件時(shí)maven官方插件(即groupid=org.apache.maven.plugins),可以省略(不推薦)时迫。
8.3解析插件版本氧枣。
- 同樣為了簡(jiǎn)化插件配置和使用,在用戶(hù)沒(méi)有提供插件版本情況下别垮,maven會(huì)自動(dòng)解析插件版本。
-
情況1:核心插件扎谎。超級(jí)POM中有配置碳想。
超級(jí)POM中為所有核心插件設(shè)定了版本,所有maven項(xiàng)目都會(huì)繼承超級(jí)pom毁靶,所以在maven項(xiàng)目中使用核心插件的版本已經(jīng)確定了胧奔。 -
情況2:非核心插件,超級(jí)POM中沒(méi)有配置
使用的插件不是核心插件预吆,超級(jí)POM中沒(méi)有配置龙填,maven會(huì)去所有倉(cāng)庫(kù)尋找可用版本,然后選擇release版拐叉,即最新發(fā)布版(而不是latest最新版岩遗,最新版有可能是快照版)
8.4插件前綴
- 前面使用mvn命令時(shí)支持插件前綴來(lái)簡(jiǎn)化插件的調(diào)用,現(xiàn)在解釋如何根據(jù)插件前綴解析得到插件的坐標(biāo)凤瘦。
- 插件前綴與groupId:artifactId是一一對(duì)應(yīng)的宿礁,這種匹配關(guān)系存儲(chǔ)在倉(cāng)庫(kù)元數(shù)據(jù)中。
有什么不懂的一起探討一下吧蔬芥,我也是在學(xué)習(xí)的路上梆靖。喜歡給我點(diǎn)個(gè)贊吧(哈哈),我會(huì)繼續(xù)努力的笔诵。