1. 程式人生 > >Maven的pom.xml檔案結構之Build配置

Maven的pom.xml檔案結構之Build配置

在Maven的pom.xml檔案中,Build相關配置包含兩個部分,一個是<build>,另一個是<reporting>,這裡我們只介紹<build>。

1. 在Maven的pom.xml檔案中,存在如下兩種<build>:

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  ...
  <!-- "Project Build" contains elements of the BaseBuild set and the Build set-->
  <build>...</build>
 
  <profiles>
    <profile>
      <!-- "Profile Build" contains elements of the BaseBuild set only -->
      <build>...</build>
    </profile>
  </profiles>
</project>
說明:
一種<build>被稱為Project Build,即是<project>的直接子元素。另一種<build>被稱為Profile Build,即是<profile>的直接子元素。

Profile Build包含了基本的build元素,而Project Build還包含兩個特殊的元素,即各種<...Directory>和<extensions>。

2. Profile Build和Project Build共用的基本build元素

1) 示例如下:

<build>
  <defaultGoal>install</defaultGoal>
  <directory>${basedir}/target</directory>
  <finalName>${artifactId}-${version}</finalName>
  ...
</build>
說明:
defaultGoal,執行構建時預設的goal或phase,如jar:jar或者package等
directory,構建的結果所在的路徑,預設為${basedir}/target目錄
finalName,構建的最終結果的名字,該名字可能在其他plugin中被改變


2) <resources>

資源往往不是程式碼,無需編譯,而是一些properties或XML配置檔案,構建過程中會往往會將資原始檔從源路徑複製到指定的目標路徑。

<resources>給出各個資源在Maven專案中的具體路徑。示例如下:

  <build>
    ...
    <filters>
      <filter>filters/filter1.properties</filter>
    </filters>
    <resources>
      <resource>
        <targetPath>META-INF/plexus</targetPath>
        <filtering>false</filtering>
        <directory>${basedir}/src/main/plexus</directory>
        <includes>
          <include>configuration.xml</include>
        </includes>
        <excludes>
          <exclude>**/*.properties</exclude>
        </excludes>
      </resource>
    </resources>
    <testResources>
      ...
    </testResources>
    ...
  </build>
說明:
resources,build過程中涉及的資原始檔
targetPath,資原始檔的目標路徑
filtering,構建過程中是否對資源進行過濾,預設false
directory,資原始檔的路徑,預設位於${basedir}/src/main/resources/目錄下
includes,一組檔名的匹配模式,被匹配的資原始檔將被構建過程處理
excludes,一組檔名的匹配模式,被匹配的資原始檔將被構建過程忽略。同時被includes和excludes匹配的資原始檔,將被忽略。
filters,給出對資原始檔進行過濾的屬性檔案的路徑,預設位於${basedir}/src/main/filters/目錄下。屬性檔案中定義若干鍵值對。在構建過程中,對於資原始檔中出現的變數(鍵),將使用屬性檔案中該鍵對應的值替換。
testResources,test過程中涉及的資原始檔,預設位於${basedir}/src/test/resources/目錄下。這裡的資原始檔不會被構建到目標構件中


3) <plugins>

<plugins>給出構建過程中所用到的外掛。

  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <extensions>false</extensions>
        <inherited>true</inherited>
        <configuration>
          <classifier>test</classifier>
        </configuration>
        <dependencies>...</dependencies>
        <executions>...</executions>
      </plugin>
    </plugins>
  </build>
說明:

groupId
artifactId
version
extensions,是否載入該外掛的擴充套件,預設false
inherited,該外掛的configuration中的配置是否可以被(繼承該POM的其他Maven專案)繼承,預設true
configuration,該外掛所需要的特殊配置,在父子專案之間可以覆蓋或合併
dependencies,該外掛所特有的依賴類庫
executions,該外掛的某個goal(一個外掛中可能包含多個goal)的執行方式。一個execution有如下設定:
id,唯一標識
goals,要執行的外掛的goal(可以有多個),如<goal>run</goal>
phase,外掛的goal要嵌入到Maven的phase中執行,如verify
inherited,該execution是否可被子專案繼承
configuration,該execution的其他配置引數


4) <pluginManagement>

在<build>中,<pluginManagement>與<plugins>並列,兩者之間的關係類似於<dependencyManagement>與<dependencies>之間的關係。<pluginManagement>中也配置<plugin>,其配置引數與<plugins>中的<plugin>完全一致。只是,<pluginManagement>往往出現在父專案中,其中配置的<plugin>往往通用於子專案。子專案中只要在<plugins>中以<plugin>宣告該外掛,該外掛的具體配置引數則繼承自父專案中<pluginManagement>對該外掛的配置,從而避免在子專案中進行重複配置。

3. Project Build特有的<...Directory>

往往配置在父專案中,供所有父子專案使用。示例如下:

  <build>
    <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
    <outputDirectory>${basedir}/target/classes</outputDirectory>
    <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
    ...
  </build>
</project>
目錄可以使用絕對路徑,如示例所示。如果使用相對路徑,則所有的相對路徑都是在${basedir}目錄下。

4. Project Build特有的<extensions>

<extensions>是執行構建過程中可能用到的其他工具,在執行構建的過程中被加入到classpath中。

也可以通過<extensions>啟用構建外掛,從而改變構建的過程。

通常,通過<extensions>給出通用外掛的一個具體實現,用於構建過程。

<extensions>的使用示例如下:

  <build>
    ...
    <extensions>
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ftp</artifactId>
        <version>1.0-alpha-3</version>
      </extension>
    </extensions>
    ...
  </build>
</project>