1. 程式人生 > >什麼是pom.xml?有什麼作用?--pom.xml詳解

什麼是pom.xml?有什麼作用?--pom.xml詳解

什麼是POM?

POM是專案物件模型(Project Object Model)的簡稱,它是Maven專案中的檔案,使用XML表示,名稱叫做pom.xml。作用類似ant的build.xml檔案,功能更強大。該檔案用於管理:原始碼、配置檔案、開發者的資訊和角色、問題追蹤系統、組織資訊、專案授權、專案的url、專案的依賴關係等等。事實上,在Maven世界中,project可以什麼都沒有,甚至沒有程式碼,但是必須包含pom.xml檔案。

概覽

下面是一個POM專案中的pom.xml檔案中包含的元素。注意,其中的modelVersion是4.0.0,這是當前僅有的可以被Maven2&3同時支援的POM版本,它是必須的。

複製程式碼

<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>
    
    <!-- 基本設定 The Basics -->
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <packaging>...</packaging>
    <dependencies>...</dependencies>
    <parent>...</parent>
    <dependencyManagement>...</dependencyManagement>
    <modules>...</modules>
    <properties>...</properties>
    
    <!-- 構建過程的設定 Build Settings -->
    <build>...</build>
    <reporting>...</reporting>
    
    <!-- 專案資訊設定 More Project Information -->
    <name>...</name>
    <description>...</description>
    <url>...</url>
    <inceptionYear>...</inceptionYear>
    <licenses>...</licenses>
    <organization>...</organization>
    <developers>...</developers>
    <contributors>...</contributors>
    
    <!-- 環境設定 Environment Settings -->
    <issueManagement>...</issueManagement>
    <ciManagement>...</ciManagement>
    <mailingLists>...</mailingLists>
    <scm>...</scm>
    <prerequisites>...</prerequisites>
    <repositories>...</repositories>
    <pluginRepositories>...</pluginRepositories>
    <distributionManagement>...</distributionManagement>
    <profiles>...</profiles>
</project>

複製程式碼

一,基本配置

1.1 maven的協作相關屬性

  一個最簡單的pom.xml的定義必須包含modelVersion、groupId、artifactId和version這四個元素,當然這其中的元素也是可以從它的父專案中繼承的。在Maven中,使用groupId、artifactId和version組成groupdId:artifactId:version的形式來唯一確定一個專案:

複製程式碼

<?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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!-- 
        含義:組織標識,定義了專案屬於哪個組,風向標,座標,或者說若把本專案打包
        用途:此名稱則是本地倉庫中的路徑,列如:otowa.user.dao,在M2_REPO目錄下,將是: otowa/user/dao目錄
        命名規範:專案名稱,模組,子模組
    -->
    <groupId>otowa.user.dao</groupId>
    <!-- 
        含義:專案名稱也可以說你所模組名稱,定義當面Maven專案在組中唯一的ID
        用途:例如:user-dao,在M2_REPO目錄下,將是:otowa/user/dao/user-dao目錄
        命名規範:唯一就好
    -->
    <artifactId>user-dao</artifactId>
    <!-- 
        含義:專案當前的版本號
        用途:例如:0.0.1-SNAPSHOT,在M2_REPO目錄下,將是:otowa/user/dao/user-dao/0.0.1-SNAPSHOT目錄
    -->
    <version>0.0.1-SNAPSHOT</version>
    <!-- 打包的格式,可以為:pom , jar , maven-plugin , ejb , war , ear , rar , par -->
    <packaging>war</packaging>
    <!-- 元素聲明瞭一個對使用者更為友好的專案名稱 -->
    <name>maven</name>
</project>

複製程式碼

1.2 POM之間的關係,繼承、聚合與依賴

  我們知道Maven在建立專案的時候是基於Maven專案下的pom.xml進行的,我們專案依賴的資訊和一些基本資訊都是在這個檔案裡面定義的。那如果當我們有多個專案要進行,這多個專案有些配置內容是相同的,有些是要彼此關聯的,那如果按照傳統的做法的話我們就需要在多個專案中都定義這些重複的內容。這無疑是非常耗費時間和不易維護的。好在Maven給我們提供了一個pom的繼承和聚合的功能。

       對於使用java的人而言,繼承這個詞大家應該都不陌生。要繼承pom就需要有一個父pom,在Maven中定義了超級pom.xml,任何沒有申明自己父pom.xml的pom.xml都將預設繼承自這個超級pom.xml。

  位置:

    在Maven 2.xxx版本中,比如maven-2.0.9-uber.jar,開啟此Jar檔案後,在包包org.apache.maven.project下會有pom-4.0.0.xml的檔案。
    但是到了3.xxx版本之後在: aven安裝目錄下的:/lib/maven-model-builder-version.jar中 \org\apache\maven\mode目錄中的pom-4.0.0.xml。

      先來看一下這個超級pom.xml的定義:

複製程式碼

<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!-- START SNIPPET: superpom -->
<project>
  <modelVersion>4.0.0</modelVersion>

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

  <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url>
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
      <releases>
        <updatePolicy>never</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <directory>${project.basedir}/target</directory>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${project.basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
    <resources>
      <resource>
        <directory>${project.basedir}/src/main/resources</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>${project.basedir}/src/test/resources</directory>
      </testResource>
    </testResources>
    <pluginManagement>
      <!-- NOTE: These plugins will be removed from future versions of the super POM -->
      <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
        </plugin>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.2-beta-5</version>
        </plugin>
        <plugin>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.8</version>
        </plugin>
        <plugin>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.3.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

  <reporting>
    <outputDirectory>${project.build.directory}/site</outputDirectory>
  </reporting>

  <profiles>
    <!-- NOTE: The release profile will be removed from future versions of the super POM -->
    <profile>
      <id>release-profile</id>

      <activation>
        <property>
          <name>performRelease</name>
          <value>true</value>
        </property>
      </activation>

      <build>
        <plugins>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-javadoc-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <inherited>true</inherited>
            <artifactId>maven-deploy-plugin</artifactId>
            <configuration>
              <updateReleaseInfo>true</updateReleaseInfo>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

</project>
<!-- END SNIPPET: superpom -->

複製程式碼

  對於一個pom.xml來說有幾個元素是必須定義的,一個是project根元素,然後就是它裡面的modelVersion、groupId、artifactId和version。由上面的超級pom.xml的內容我們可以看到pom.xml中沒有groupId、artifactId和version的定義,所以我們在建立自己的pom.xml的時候就需要定義這三個元素。和java裡面的繼承類似,子pom.xml會完全繼承父pom.xml中所有的元素,而且對於相同的元素,一般子pom.xml中的會覆蓋父pom.xml中的元素,但是有幾個特殊的元素它們會進行合併而不是覆蓋。這些特殊的元素是:

  • dependencies
  • developers
  • contributors
  • plugin列表,包括plugin下面的reports
  • resources

1.2.1 繼承

1.2.1.1 被繼承專案與繼承專案是父子目錄關係

       現在假設我們有一個專案projectA,它的pom.xml定義如下:

複製程式碼

<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/maven-v4_0_0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>com.tiantian.mavenTest</groupId>  
  <artifactId>projectA</artifactId>  
  <packaging>jar</packaging>  
  <version>1.0-SNAPSHOT</version>  
</project>  

複製程式碼

  然後我們有另一個專案projectB,而且projectB是跟projectA的pom.xml檔案處於同一個目錄下,這時候如果projectB需要繼承自projectA的話我們可以這樣定義projectB的pom.xml檔案。

複製程式碼

<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/maven-v4_0_0.xsd">  
  <parent>  
    <groupId>com.tiantian.mavenTest</groupId>  
    <artifactId>projectA</artifactId>  
    <version>1.0-SNAPSHOT</version>  
  </parent>  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>com.tiantian.mavenTest</groupId>  
  <artifactId>projectB</artifactId>  
  <packaging>jar</packaging>  
  <version>1.0-SNAPSHOT</version>  
</project>  

複製程式碼

  由projectB的pom.xml檔案的定義我們可以知道,當需要繼承指定的一個Maven專案時,我們需要在自己的pom.xml中定義一個parent元素,在這個元素中指明需要繼承專案的groupId、artifactId和version。

1.2.1.2 被繼承專案與繼承專案的目錄結構不是父子關係

  當被繼承專案與繼承專案的目錄結構不是父子關係的時候,我們再利用上面的配置是不能實現Maven專案的繼承關係的,這個時候我們就需要在子專案的pom.xml檔案定義中的parent元素下再加上一個relativePath元素的定義,用以描述父專案的pom.xml檔案相對於子專案的pom.xml檔案的位置。

  假設我們現在還是有上面兩個專案,projectA和projectB,projectB還是繼承自projectA,但是現在projectB不在projectA的子目錄中,而是與projectA處於同一目錄中。這個時候projectA和projectB的目錄結構如下:

  ------projectA

    ------pom.xml

  ------projectB

    ------pom.xml

  這個時候我們可以看出projectA的pom.xml相對於projectB的pom.xml的位置是“../projectA/pom.xml”,所以這個時候projectB的pom.xml的定義應該如下所示:

複製程式碼

<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/maven-v4_0_0.xsd">  
  <parent>  
    <groupId>com.tiantian.mavenTest</groupId>  
    <artifactId>projectA</artifactId>  
    <version>1.0-SNAPSHOT</version>  
       <relativePath>../projectA/pom.xml</relativePath>  
  </parent>  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>com.tiantian.mavenTest</groupId>  
  <artifactId>projectB</artifactId>  
  <packaging>jar</packaging>  
  <version>1.0-SNAPSHOT</version>  
</project>  

複製程式碼

1.2.2 聚合

       對於聚合這個概念搞java的人應該都不會陌生。先來說說我對聚合和被聚合的理解,比如說如果projectA聚合到projectB,那麼我們就可以說projectA是projectB的子模組, projectB是被聚合專案,也可以類似於繼承那樣稱為父專案。對於聚合而言,這個主體應該是被聚合的專案。所以,我們需要在被聚合的專案中定義它的子模組,而不是像繼承那樣在子專案中定義父專案。具體做法是:

  • 修改被聚合專案的pom.xml中的packaging元素的值為pom
  • 在被聚合專案的pom.xml中的modules元素下指定它的子模組專案

對於聚合而言,當我們在被聚合的專案上使用Maven命令時,實際上這些命令都會在它的子模組專案上使用。這就是Maven中聚合的一個非常重要的作用。假設這樣一種情況,你同時需要打包或者編譯projectA、projectB、projectC和projectD,按照正常的邏輯我們一個一個專案去使用mvn compile或mvn package進行編譯和打包,對於使用Maven而言,你還是這樣使用的話是非常麻煩的。因為Maven給我們提供了聚合的功能。我們只需要再定義一個超級專案,然後在超級專案的pom.xml中定義這個幾個專案都是聚合到這個超級專案的。之後我們只需要對這個超級專案進行mvn compile,它就會把那些子模組專案都進行編譯。

1.2.2.1 被聚合專案和子模組專案在目錄結構上是父子關係

  還拿上面定義的projectA和projectB來舉例子,現在假設我們需要把projectB聚合到projectA中。projectA和projectB的目錄結構如下所示:

  ------projectA

    ------projectB

      -----pom.xml

    ------pom.xml

  這個時候projectA的pom.xml應該這樣定義:

複製程式碼

<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.tiantian.mavenTest</groupId>  
  <artifactId>projectA</artifactId>  
  <version>1.0-SNAPSHOT</version>  
  <packaging>pom</packaging>  
  <modules>  
       <module>projectB</module>  
  </modules>  
</project>  

複製程式碼

  由上面的定義我們可以看到被聚合的專案的packaging型別應該為pom,而且一個專案可以有多個子模組專案。對於聚合這種情況,我們使用子模組專案的artifactId來作為module的值,表示子模組專案相對於被聚合專案的地址,在上面的示例中就表示子模組projectB是處在被聚合專案的子目錄下,即與被聚合專案的pom.xml處於同一目錄。這裡使用的module值是子模組projectB對應的目錄名projectB,而不是子模組對應的artifactId。這個時候當我們對projectA進行mvn package命令時,實際上Maven也會對projectB進行打包。

1.2.2.2 被聚合專案與子模組專案在目錄結構上不是父子關係

  那麼當被聚合專案與子模組專案在目錄結構上不是父子關係的時候,我們應該怎麼來進行聚合呢?還是像繼承那樣使用relativePath元素嗎?答案是非也,具體做法是在module元素中指定以相對路徑的方式指定子模組。我們來看下面一個例子。

  繼續使用上面的projectA和projectB,還是需要把projectB聚合到projectA,但是projectA和projectB的目錄結構不再是父子關係,而是如下所示的這種關係:

  ------projectA

    ------pom.xml

  ------projectB

    ------pom.xml

  這個時候projectA的pom.xml檔案就應該這樣定義:

複製程式碼

<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.tiantian.mavenTest</groupId>  
  <artifactId>projectA</artifactId>  
  <version>1.0-SNAPSHOT</version>  
  <packaging>pom</packaging>  
  <modules>  
       <module>../projectB</module>  
  </modules>  
</project>  

複製程式碼

  注意看module的值是“../projectB”,我們知道“..”是代表當前目錄的上層目錄,所以它表示子模組projectB是被聚合專案projectA的pom.xml檔案所在目錄(即projectA)的上層目錄下面的子目錄,即與projectA處於同一目錄層次。注意,這裡的projectB對應的是projectB這個專案的目錄名稱,而不是它的artifactId

1.2.2.3 聚合與繼承同時進行

       假設有這樣一種情況,有兩個專案,projectA和projectB,現在我們需要projectB繼承projectA,同時需要把projectB聚合到projectA。然後projectA和projectB的目錄結構如下:

       ------projectA

              ------pom.xml

       ------projectB

              ------pom.xml

       那麼這個時候按照上面說的那樣,projectA的pom.xml中需要定義它的packaging為pom,需要定義它的modules,所以projectA的pom.xml應該這樣定義:

複製程式碼

<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.tiantian.mavenTest</groupId>  
  <artifactId>projectA</artifactId>  
  <version>1.0-SNAPSHOT</version>  
  <packaging>pom</packaging>  
  <modules>  
       <module>../projectB</module>  
  </modules>  
</project>  

複製程式碼

  而projectB是繼承自projectA的,所以我們需要在projectB的pom.xml檔案中新增一個parent元素,用以定義它繼承的專案資訊。所以projectB的pom.xml檔案的內容應該這樣定義:

複製程式碼

<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>  
  <parent>  
       <groupId>com.tiantian.mavenTest</groupId>  
       <artifactId>projectA</artifactId>  
       <version>1.0-SNAPSHOT</version>  
       <relativePath>../projectA/pom.xml</relativePath>  
  </parent>  
  <groupId>com.tiantian.mavenTest</groupId>  
  <artifactId>projectB</artifactId>  
  <version>1.0-SNAPSHOT</version>  
  <packaging>jar</packaging>  
</project>  

複製程式碼

1.2.3 依賴關係:依賴關係列表(dependency list)是POM的重要部分

       專案之間的依賴是通過pom.xml檔案裡面的dependencies元素下面的dependency元素進行的。一個dependency元素定義一個依賴關係。在dependency元素中我們主要通過依賴專案的groupId、artifactId和version來定義所依賴的專案。

       先來看一個簡單的專案依賴的示例吧,假設我現在有一個專案projectA,然後它裡面有對junit的依賴,那麼它的pom.xml就類似以下這個樣子:

複製程式碼

<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.tiantian.mavenTest</groupId>  
  <artifactId>projectB</artifactId>  
  <version>1.0-SNAPSHOT</version>  
  <packaging>jar</packaging>  
   
  <dependencies>  
    <dependency>  
      <groupId>junit</groupId>  
      <artifactId>junit</artifactId>  
      <version>3.8.1</version>  
      <scope>test</scope>  
      <optional>true</optional>  
    </dependency>  
  </dependencies>  
</project>  

複製程式碼

groupId, artifactId, version:描述了依賴的專案唯一標誌。

type:對應於依賴專案的packaging型別,預設是jar。

scope:用於限制相應的依賴範圍、傳播範圍。scope的主要取值範圍如下(還有一個是在Maven2.0.9以後版本才支援的import,關於import作用域將在後文《Dependency介紹》中做介紹):

  • test:在測試範圍有效,它在執行命令test的時候才執行,並且它不會傳播給其他模組進行引入,比如 junit,dbunit 等測試框架。
  • compile(default 預設):這是它的預設值,這種型別很容易讓人產生誤解,以為只有在編譯的時候才是需要的,其實這種型別表示所有的情況都是有用的,包括編譯和執行時。而且這種型別的依賴性是可以傳遞的。
  • runtime:在程式執行的時候依賴,在編譯的時候不依賴。
  • provided:這個跟compile很類似,但是它表示你期望這個依賴專案在執行時由JDK或者容器來提供。這種型別表示該依賴只有在測試和編譯的情況下才有效,在執行時將由JDK或者容器提供。這種型別的依賴性是不可傳遞的。比如 javaee:

    • eclipse開發web環境中是沒有javaee必須要手動新增。
    • myeclipse新建web專案會有JavaEE(servlet-api.jar,jsp-api.jar...)web容器依賴的jar包,一般都是做開發的時候才使用。但是myeclipse不會把這些 jar包釋出的,lib下你是找不到javaee引入的jar包,因為myeclipse釋出專案的時候會忽略它。為什麼?因為tomcat容器bin/lib已經存在了這個jar包了。
  • system:這種型別跟provided類似,唯一不同的就是這種型別的依賴我們要自己提供jar包,這需要與另一個元素systemPath來結合使用。systemPath將指向我們系統上的jar包的路徑,而且必須是給定的絕對路徑。
    • systemPath:上面已經說過了這個元素是在scope的值為system的時候用於指定依賴的jar包在系統上的位置的,而且是絕對路徑。該元素必須在依賴的 jar包的scope為system時才能使用,否則Maven將報錯。
    • optional:當該專案本身作為其他專案的一個依賴時標記該依賴為可選項。假設現在projectA有一個依賴性projectB,我們把projectB這個依賴項設為optional,這表示projectB在projectA的執行時不一定會用到。這個時候如果我們有另一個專案projectC,它依賴於projectA,那麼這個時候因為projectB對於projectA是可選的,所以Maven在建立projectC的時候就不會安裝projectB,這個時候如果projectC確實需要使用到projectB,那麼它就可以定義自己對projectB的依賴。當一個依賴是可選的時候,我們把optional元素的值設為true,否則就不設定optional元素。
    • exclusions:考慮這樣一種情況,我們的projectA依賴於projectB,然後projectB又依賴於projectC,但是在projectA裡面我們不需要projectB依賴的projectC,那麼這個時候我們就可以在依賴projectB的時候使用exclusions元素下面的exclusion排除projectC。這個時候我們可以這樣定義projectA對projectB的依賴:

      複製程式碼

      <dependencies>  
           <dependency>  
                  <groupId>com.tiantian.mavenTest</groupId>  
                  <artifactId>projectB</artifactId>  
                  <version>1.0-SNAPSHOT</version>  
                  <exclusions>  
                         <exclusion>  
                                <groupId>com.tiantian.mavenTest</groupId>  
                                <artifactId>projectC</artifactId>  
                         </exclusion>  
                  </exclusions>  
           </dependency>  
      </dependencies>

      複製程式碼

1.3 屬性

在pom.xml檔案中我們可以使用${propertyName}的形式引用屬性。是值的佔位符,類似EL,類似ant的屬性,比如${X},可用於pom檔案任何賦值的位置。有以下分類:

  • env.propertyName:這種形式表示引用的是環境變數,比如我們需要引用當前系統的環境變數PATH的時候,就可以使用${env.PATH}。
  • project.propertyName:這種形式表示引用的是當前這個pom.xml中project根元素下面的子元素的值。比如我們需要引用當前project下面的version的時候,就可以使用${project.version}。
  • settings.propertyName:這種形式引用的是Maven本地配置檔案settings.xml或本地Maven安裝目錄下的settings.xml檔案根元素settings下的元素。比如我們需要引用settings下的本地倉庫localRepository元素的值時,我們可以用${settings.localRepository}
  • Java System Properties:java的系統屬性,所有在java中使用java.lang.System.getProperties()能夠獲取到的屬性都可以在pom.xml中引用,比如${java.home}。
  • 自定義:pom.xml中properties元素下面的子元素作為屬性。假如在pom.xml中有如下一段程式碼<properties><hello.world>helloWorld</hello.world></properties>,那麼我們就可以使用${hello.world}引用到對應的helloWorld。