Maven的plugin與goal管理

在了解Maven的生命周期(lifecycle)之前,我們需要先了解Maven的Plugin與goal

通過(guò)上一篇文檔Maven的基本概念,我們了解到:goal是Maven中執(zhí)行任務(wù)的最基本的單元;plugin又是提供goal的主體。因此了解maven中的plugin和goal的基本規(guī)則,以及學(xué)會(huì)如何查找和如何使用合適的plugin、goal至關(guān)重要(就像使用vim一樣,要學(xué)會(huì)如何找到合適的第三方插件,以及學(xué)會(huì)如何使用這個(gè)插件一樣)。

Plugin的分類

Maven中Plugin分為兩種類型:

  • build類型Plugin只能在build階段執(zhí)行,在POM中需要在 <build/> 標(biāo)簽下進(jìn)行配置。

  • reporting類型:在site generation階段被執(zhí)行。在POM中需要在<reporting/>標(biāo)簽下配置。

一些常見(jiàn)的Maven 官方的插件插件:

https://maven.apache.org/plugins/index.html

https://repo.maven.apache.org/maven2/org/apache/maven/plugins/

一些常見(jiàn)的Maven官方之外的,按照插件開(kāi)發(fā)規(guī)則添加的常用插件:

https://www.mojohaus.org/plugins.html

如何識(shí)別一個(gè)plugin與goal

標(biāo)識(shí)一個(gè)plugin的最規(guī)范的路徑是:groupId:artifactId:version。標(biāo)識(shí)一個(gè)goal的最規(guī)范的路徑為groupId:artifactId:version:goal

例如執(zhí)行 mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:system 實(shí)際上就是執(zhí)行了 mvn help:system;這樣的使用方式主要是由于直接使用groupid,artifactid,version的方式是比較復(fù)雜的,所以在maven中引入的goalPrefix的概念,其實(shí)就是給上邊冗余的指定plugin的命名方式給了一個(gè)簡(jiǎn)稱。

Plugin的簡(jiǎn)稱/goalPrefix的命名規(guī)則

maven的plugin分為兩種類型,一種是maven官方發(fā)布的plugin,另一種是按照maven的plugin開(kāi)發(fā)要求開(kāi)發(fā)的第三方的plugin。plugin的prefix官方規(guī)則文檔介紹著兩種plugin的主要區(qū)別。

  • 官方插件:都是使用org.apache.maven.plugins
    作為groupid;其插件對(duì)應(yīng)的artifactid都是 maven-prefixname/goalprefix-plugin的規(guī)則;maven官方的plugins metadata store給出了基本上可以用的官方plugin的全部?jī)?nèi)容,以及其對(duì)應(yīng)的goalprefix。

  • 第三方插件:org.codehaus.mojo 就是一個(gè)第三方插件的集合groupid,其中有非常多有用的插件;并且個(gè)人也可以按照plugin的dev文檔來(lái)開(kāi)發(fā)自己的第三方的插件,然后進(jìn)行發(fā)布。

如何自主學(xué)習(xí)某個(gè)Plugin的使用方法

在實(shí)際的plugin和goal的使用中需要解決兩個(gè)問(wèn)題:(1)如何找到能夠解決某個(gè)問(wèn)題的plugin;(2)如何學(xué)習(xí)這個(gè)plugin的多個(gè)goals的使用方式。

  • 查找合適的plugin的方法:一般可以通過(guò)官方提供Available Plugins;或者通過(guò)一些比較常用的第三方plugin集合(org.codehaus.mojo )中尋找合適的插件。

  • 學(xué)習(xí)某個(gè)plugin如何使用:

    • 使用plugin自帶的helpgoal:例如直接使用 mvn compiler:help可以查看對(duì)應(yīng)的compiler插件有多個(gè)少個(gè)goals。

      image.png

      并且還可以進(jìn)一步通過(guò)mvn compiler:help -Ddetail=true -Dgoal=<goal-name>來(lái)查看詳細(xì)的每一個(gè)goal對(duì)應(yīng)的參數(shù)使用方法。

    • 使用maven的help插件的describegoal來(lái)了解plugin和goals的功能;例如下邊的例子

mvn help:describe -Dcmd=compile
mvn help:describe -Dcmd=compiler:compile
mvn help:describe -Dplugin=org.apache.maven.plugins:maven-compiler-plugin
mvn help:describe -DgroupId=org.apache.maven.plugins -DartifactId=maven-compiler-plugin

Plugin在POM中如何配置

當(dāng)我們學(xué)會(huì)使用一個(gè)maven plugin的時(shí)候,在選擇執(zhí)行其對(duì)應(yīng)的某個(gè)goal的時(shí)候,可以添加上不同的參數(shù)來(lái)控制goal執(zhí)行的行為。例如 mvn plugin:help -Ddetail=true可以打印出plugin幫助信息的一些詳細(xì)參數(shù);或者使用mvn plugin:help -Dgoal=goalname
僅僅打印某個(gè)goal的幫助信息。

maven的官方文檔給出了如何對(duì)Plugin進(jìn)行配置。plugin分為兩種類型(build類型與reporting類型),這兩種類型有公共的部分,也有各自特殊的部分。

  • 公共部分的配置:主要在于對(duì)應(yīng)的每一個(gè)不同goal的執(zhí)行所需要的parameters的配置上。在實(shí)現(xiàn)一個(gè)goal的時(shí)候,會(huì)定義不同的參數(shù),每一個(gè)參數(shù)都有其對(duì)應(yīng)的數(shù)據(jù)類型(比如簡(jiǎn)單的類型:string,boolean,int,double等;復(fù)雜的一些對(duì)象數(shù)據(jù)類型;甚至一些collections或者property類型。)主要的使用方式如下:
 <configuration>
    <url>http://www.baidu.com</url>
 </configuration>

相當(dāng)于配置了對(duì)應(yīng)的goal中url的屬性為http://www.baidu.com

  • build類型的plugin特殊的配置:這里主要說(shuō)下executionstags,其他配置參數(shù)可以直接參考官方的文檔進(jìn)行學(xué)習(xí)。execution的主要作用是可以把一個(gè)插件的某個(gè)goal或者某些goals綁定到一個(gè)executionid上,或者綁定到某個(gè)phase上。例如下邊的這個(gè)例子
<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-myquery-plugin</artifactId>
        <version>1.0</version>
        <executions>
          // 第一個(gè)execution配置
          <execution>
            <id>execution1</id>
            <phase>test</phase>
            <configuration>
              <url>http://www.bar.com/query</url>
              <timeout>15</timeout>
            </configuration>
            <goals>
              <goal>query</goal>
            </goals>
          </execution>
          // 第二個(gè)execution配置
          <execution>
            <id>execution2</id>
            <configuration>
              <url>http://www.bar.com/query</url>
              <timeout>15</timeout>
              <options>
                <option>four</option>
                <option>five</option>
                <option>six</option>
              </options>
            </configuration>
            <goals>
              <goal>query</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

將同一個(gè)插件分別設(shè)置了多個(gè)exection,execution1是將其綁定到了test階段(phase)上;exection2并沒(méi)有綁定到任何階段。那么如下的兩個(gè)命令都分別可以執(zhí)行對(duì)應(yīng)的goal(query):

mvn test
mvn plugin:goal@execution2
  • reporting部分使用的不是太多,具體使用的時(shí)候,可以直接查閱上面給到的plugin配置鏈接進(jìn)行查閱。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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