Maven預設的 建構生命週期 對於第一次使用Maven很方便,下載Maven、設定環境變數,然後執行mvn指令,就可以開始撰寫程式並進行建構等動作,相對於Ant必須進一步規畫專案架構,撰寫build.xml來說,是方便多了。
然而,預設的建構並不一定滿足你的要求,此時你可以開始進行pom.xml的設定,正如 使用 Maven 中略為提過的,你不用像在Ant中提供建構動作等資訊。事實上,相關的建構資訊都是由一個父POM繼承下來,正如Java中所有物件都繼承自java.lang.Object,Maven中所有POM都預設繼承Super POM,如果你沒有在自己的POM中設定,那就是採Super POM中的預設值。
你可以檢視目前產生的專案中pom.xml作為起點,每個pom.xml的根標籤是<project>。最基本的POM至少要包括:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>cc.openhome</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
<modelVersion>4.0.0</modelVersion>
<groupId>cc.openhome</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
<modelVersion>指明目前使用的POM版本是第四版,<groudId>指定你的組織名稱,<artifactId>指出管理專案中製品的名稱,通常就是專案名稱,<version>指出你的專案版本,<packaging>指出包裝專案時所使用的格式,預設使用JAR。
在 建構生命週期 中談到了建構的階段(Phase)與目的(Goal),事實上,使用mvn指令呼叫執行某個階段,都是呼叫某個plugin來執行,這在 使用 Maven 也有略提,像是編譯時會使用mvn compile,這會呼叫Maven的 maven-compiler-plugin,這個plugin在Super POM中會有預設值,不過你可以進行相關修改。例如,若想指定javac編譯選題的-source與-target,可以如下於pom.xml中設定:
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.4</source>
<target>1.4</target>
</configuration>
</plugin>
</plugins>
</build>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.4</source>
<target>1.4</target>
</configuration>
</plugin>
</plugins>
</build>
...
你可以在 http://maven.apache.org/plugins/maven-compiler-plugin/ 找到更多maven-compiler-plugin的設定方式。
在執行mvn指令時,都會有一些[INFO],你可以觀察到所使用的plugin,並可據以找到相關plugin的設定方式。例如若下mvn package,則可以看到以下的訊息...
[INFO] Scanning for projects......
...
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ example
...
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ example ---
...
[INFO] --- maven-surefire-plugin:2.7.1:test (default-test) @ example ---
...
[INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ example ---
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.489s
[INFO] Finished at: Tue Jan 25 14:32:51 CST 2011
[INFO] Final Memory: 6M/16M
[INFO] ------------------------------------------------------------------------
...
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ example
...
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ example ---
...
[INFO] --- maven-surefire-plugin:2.7.1:test (default-test) @ example ---
...
[INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ example ---
...
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.489s
[INFO] Finished at: Tue Jan 25 14:32:51 CST 2011
[INFO] Final Memory: 6M/16M
[INFO] ------------------------------------------------------------------------
maven-resources-plugin處理專案資源的複製,maven-compiler-plugin負責專案的編譯,maven-surefire-plugin負責專案的單元測試,maven-jar-plugin負責專案的包裝。
Maven在執行mvn指令時,若還沒下載plugin,會自動下載,若沒有在POM中設定,就採預設值,你可以在 http://maven.apache.org/plugins/ 找到一些plugin的使用說明。例如,maven-source-plugin 可以將原始碼亦包裝為JAR:
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>verify</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
在上例中,<phase>指定了在verify階段(Phase)時,執行jar-no-fork的目的,這是設定在<goals>與<goal>中。你可以使用mvn source:jar來呼叫。
在 使用 Maven 中指定主類別執行Java程式的plugin,則是 exec-maven-plugin。
至於專案中程式庫的相依性,也是在POM中指定,以預設產生的pom.xml為例:
...
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
...
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
...
<dependencies>中設定了相依程式庫的資訊,每個<dependency>中要設定哪些值,可以在 http://mvnrepository.com/ 搜尋。例如修改預設的版本為4.8.2:
...
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
...
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
...
<dependency>中設定的程式庫,只要存在於你的本地貯藏室就可以了,無論是你自己產生的JAR安裝至貯藏室,或從網路下載而來的JAR,設定方式都是一樣的。