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,分別為compile及testCompile。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分別有pom
,jar
,maven-plugin
,ejb
,war
,ear
,rar
。
例如下面是jar
的default 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。
參考:
沒有留言:
張貼留言