網頁

2018/9/20

Maven phase,plugin,goal的關係

Maven有幾個重要的概念,分別是phase,plugin及goal,其關係如下。

Maven的phase是指Maven build lifecycle中的每一階段,也就是建置專案過程中的每一個步驟。請參考Maven 專案建置的生命週期(Maven Build Lifecycle)

而Maven本身其實是個plugin的執行框架,所有建構階段的工作實際上是交由plugin的goal處理,而Maven僅是安排每個phase工作的執行順序而以。

Maven plugin為一種artifact,一個plugin中會可能包含多個goal;也就是說plugin是goal的容器。

例如Complier plugin中有兩個goal,分別為compiletestCompile。compile用來編譯主要程式的原始碼;testCompile用來編譯測試程式的原始碼。

plugin中的goal會有綁定哪一個phase的資訊,例如compiler:compile預設綁定compile phase;compiler:testCompile預設綁定test-compile phase。

Maven可在pom.xml中的<packaging>設定要使用的packaging,例如

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging><!-- 指定packageing -->
    
    ....

</project>

Maven的packaging提供了預設的phase與plugin goal的綁定關係。

你可以在maven-core.jar函式庫中的META-INF/plexus/default-bindings.xml找到各packaging預設的綁定資訊。

maven-core預設的packaging分別有pomjarmaven-pluginejbwarearrar

例如下面是jardefault lifecycle的phase綁定資訊

<lifecycle>
  <id>default</id>
  <!-- START SNIPPET: jar-lifecycle -->
  <phases>
    <process-resources>
      org.apache.maven.plugins:maven-resources-plugin:2.6:resources
    </process-resources>
    <compile>
      org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
    </compile>
    <process-test-resources>
      org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
    </process-test-resources>
    <test-compile>
      org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
    </test-compile>
    <test>
      org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
    </test>
    <package>
      org.apache.maven.plugins:maven-jar-plugin:2.4:jar
    </package>
    <install>
      org.apache.maven.plugins:maven-install-plugin:2.4:install
    </install>
    <deploy>
      org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
    </deploy>
  </phases>
  <!-- END SNIPPET: jar-lifecycle -->
</lifecycle>

如果在pom.xml沒有指定packaging,則Maven預設會使用jar packaging。

例如指定jar packaging的情況下,執行mvn package指令,maven會從default lifecycle的第一個phase,也就是validate開始執行,然後依序執行到package。每到一個phase時,Maven會呼叫該phase綁定的goal來處理。如果一個phase沒有綁定任何goal則會直接跳過該phase。

至於在pom.xml另外設定的plugin的goal會與packaging的goal一起綁定phase。如果一個phase綁定了多個goal,則執行到該phase時,會先執行packaging所綁定的goal,然後才執行pom.xml中綁定的plugin goal。


參考:

沒有留言:

張貼留言