maven---7生命周期和插件

  • 所有項(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

進(jìn)一步了解其他階段信息

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)源于ApacheCodehaus
    首先通過(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)插件信息

  • 基本上所有的插件插件都來(lái)源于ApacheCodehaus怜俐。

  • 以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插件的前綴。

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最新版岩遗,最新版有可能是快照版)
Paste_Image.png
Paste_Image.png

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ù)中。
Paste_Image.png
Paste_Image.png

有什么不懂的一起探討一下吧蔬芥,我也是在學(xué)習(xí)的路上梆靖。喜歡給我點(diǎn)個(gè)贊吧(哈哈),我會(huì)繼續(xù)努力的笔诵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末返吻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乎婿,更是在濱河造成了極大的恐慌测僵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件次酌,死亡現(xiàn)場(chǎng)離奇詭異恨课,居然都是意外死亡舆乔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)剂公,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)希俩,“玉大人,你說(shuō)我怎么就攤上這事纲辽⊙瘴洌” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵拖吼,是天一觀的道長(zhǎng)鳞上。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吊档,這世上最難降的妖魔是什么篙议? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮怠硼,結(jié)果婚禮上鬼贱,老公的妹妹穿的比我還像新娘。我一直安慰自己香璃,他們只是感情好这难,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著葡秒,像睡著了一般姻乓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眯牧,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天蹋岩,我揣著相機(jī)與錄音,去河邊找鬼学少。 笑死星澳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旱易。 我是一名探鬼主播禁偎,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阀坏!你這毒婦竟也來(lái)了如暖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤忌堂,失蹤者是張志新(化名)和其女友劉穎盒至,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枷遂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年樱衷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酒唉。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矩桂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痪伦,到底是詐尸還是另有隱情侄榴,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布网沾,位于F島的核電站癞蚕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辉哥。R本人自食惡果不足惜桦山,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醋旦。 院中可真熱鬧度苔,春花似錦、人聲如沸浑度。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)箩张。三九已至,卻和暖如春窗市,著一層夾襖步出監(jiān)牢的瞬間先慷,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工咨察, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留论熙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓摄狱,卻偏偏與公主長(zhǎng)得像脓诡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子媒役,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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