pom.xml詳解

什麼是POM?

POM是項目對象模型(Project Object Model)的簡稱,它是Maven項目中的文件,使用XML表示,名稱叫作pom.xml。做用相似ant的build.xml文件,功能更強大。該文件用於管理:源代碼、配置文件、開發者的信息和角色、問題追蹤系統、組織信息、項目受權、項目的url、項目的依賴關係等等。事實上,在Maven世界中,project能夠什麼都沒有,甚至沒有代碼,可是必須包含pom.xml文件。html

概覽

下面是一個POM項目中的pom.xml文件中包含的元素。注意,其中的modelVersion是4.0.0,這是當前僅有的能夠被Maven2&3同時支持的POM版本,它是必須的。java

<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的形式來惟一肯定一個項目:web

<?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的繼承和聚合的功能。express

       對於使用java的人而言,繼承這個詞你們應該都不陌生。要繼承pom就須要有一個父pom,在Maven中定義了超級pom.xml,任何沒有申明本身父pom.xml的pom.xml都將默認繼承自這個超級pom.xml。apache

  位置:api

    在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。tomcat

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

<?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定義以下:less

<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。

本文轉自:234390216

本文出自:藝意

相關文章
相關標籤/搜索