@Maven POM 詳解

  • 前言
    • 什么是 POM
    • Quick Overview
  • POM 常用元素
  • pom.xml 完整注釋
  • 參考

0 前言

什么是 POM?

就像 Make 的 MakeFile、Ant 的 build.xml 一樣,Maven 項目的核心是 pom.xml。POM( Project Object Model,項目對象模型 ) 定義了項目的基本信息,用于描述項目如何構(gòu)建,聲明項目依賴,等等。

Quick Overview

一個完整的 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>
 
  <!-- 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>


tips:這里的 pom.xmlmodelVersion 為 4.0.

1 POM 常用元素

1.1 The Basics

1.1.1 Maven 坐標( Coordinate )

在 Maven 中坐標是構(gòu)件的唯一標識,Maven 坐標的元素包括 groupId、artifactId、versionpackaging、classifier。上述5個元素中,groupId、artifactIdversion 是必須定義的,packaging 是可選的 ( 默認為 jar )。

  • groupId:組織標識,一般為:公司網(wǎng)址的反寫+項目名
  • artifactId:項目名稱,一般為:項目名-模塊名
  • version:版本號
  • packaging:打包的方式,如:pom, jar, maven-plugin, ejb, war, ...
  • clissifier:用來幫助定義構(gòu)件輸出的一些附屬構(gòu)件。可參考此文

另外,關(guān)于 版本號 ,形式為0.0.1-SNAPSHOT

  • 第一個 0 表示大版本號,第二個 0 表示分支版本號,第三個 0 表示小版本號
  • SNAPSHOT -- 快照版本,ALPHA -- 內(nèi)側(cè)版本,BETA -- 公測版本,RELEASE -- 穩(wěn)定版本,GA -- 正式發(fā)布

在我們開發(fā)自己的 maven 項目的時候,需要為其定義適當?shù)淖鴺耍纾?/p>

<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>
 
  <!-- 項目的全球唯一標識符,通常使用全限定的包名區(qū)分該項目和其他項目。并且構(gòu)建時生成的路徑也是由此生成, 如com.seyvoue.demo生成的相對路徑為:/com/seyvoue/demo--> 
  <groupId>com.seyvoue.demo</groupId>
  <!-- 構(gòu)件的標識符,它和 groupId 一起唯一標識一個構(gòu)件。換句話說,你不能有兩個不同的項目擁有同樣的 artifactId 和 groupId;在某個特定的 groupId 下,artifactId也必須是唯一的。-->
  <artifactId>demo-maven</artifactId>
  <!-- 項目當前版本,格式為:主版本.次版本.增量版本-限定版本號-->
  <version>1.0.0-SNAPSHOT</version>
  <!-- 項目產(chǎn)生的構(gòu)件類型,例如 jar、war、pom 等。插件可以創(chuàng)建他們自己的構(gòu)件類型,所以前面列的不是全部構(gòu)件類型-->
  <packaging>jar</packaging>
  
  ...
  
</project>

1.1.2 依賴: <dependencies>...</dependencies>

比如,我的項目 project-demo1 需要添加 junit 依賴:

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.0</version>
      <type>jar</type>
      <scope>test</scope>
      <optional>true</optional>
    </dependency>
    ...
</dependencies>


dependencies元素,包括以下子元素:

  • groupId, artifactId, version

這三個是必須的,以下的那些子元素根據(jù)實際情況添加。

  • scope

scope 元素為 maven dependency 下一個控制作用域的子元素,控制該依賴包在什么情況下會被加到 classpath 中。共 6 種 scope,包括:compileprovided、runtimetest、system、import
( 具體可參考@POM Dependency Scope )

  • type

對于于 <packaging>...</packaging> ,即指定依賴包的后綴,默認為 jar

  • optional

如果當前仙姑是 projectA,projectA 需要依賴 projectB,而 projectB 的 optional 為 true,表示依賴可選,那么之后所有聲明依賴 projectA 的項目如果也依賴 projectB,就必須手動聲明。
比如,projectC 依賴 projectA 和 projectB,如果 projectC只聲明了對 projectA 的依賴,那么 projectB 不會自動加入依賴,projectA 必須手動加入對 projectB 的依賴。
也就是說依賴傳遞被打斷了。

  • exclusions

依賴傳遞:如果我們的項目引用了一個 Jar 包,而該 Jar 包又引用了其他 Jar 包,那么在默認情況下項目編譯時,Maven 會把直接引用和間接引用的 Jar 包都下載到本地。

排除依賴:如果我們只想下載直接引用的 Jar包,
那么需要在 pom.xml 中做如下配置:(將需要排除的 Jar 包的坐標寫在中)

<dependency>
 ...     
 <exclusions>
   <exclusion>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
   </exclusion>
 </exclusions>
 ...
</dependency>

依賴沖突:若項目中多個 Jar 同時引用了相同的 Jar 時,會產(chǎn)生依賴沖突,但 Maven 采用了兩種避免沖突的策略,因此在 Maven 中是不存在依賴沖突的。

  • 短路優(yōu)先
    本項目——>A.jar——>B.jar——>X.jar
    本項目——>C.jar——>X.jar
    若本項目引用了 A.jar,A.jar 又引用了 B.jar,B.jar 又引用了 X.jar,并且 C.jar 也引用了X.jar。
    在此時,Maven 只會引用引用路徑最短的Jar。
  • 聲明優(yōu)先
    若引用路徑長度相同時,在pom.xml中誰先被聲明,就使用誰。

1.1.3 聚合: <modules>...</modules>

通過 <modules>...<modules> 元素可將多個模塊聚合在同一個 project 下。

<project>  
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.seyvoue.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    ...
    
    <!--模塊(有時稱作子項目) 被構(gòu)建成項目的一部分。列出的每個模塊元素是指向該模塊的目錄的相對路徑-->
    <modules>  
        <module>account-email</module>  
        <module>account-persist</module>  
    </modules>
</project>  

1.1.4 繼承: <parent>...</parent> 和 <dependencyManagement>...</dependencyManagement>

在聚合多個項目時,如果這些被聚合的項目中需要引入相同的 Jar,那么可以將這些 Jar 寫入 父pom 中,各個子項目繼承該pom即可。類似與 java 中的繼承。
(具體可參考@Maven的聚合與繼承)

如何實現(xiàn)繼承? 示例如下:

  • 父 pom.xml:
  • <packaging>...</packaging> 必須配置為 pom
  • 將需要繼承的 Jar 包的坐標放入<dependencyManagement>...</dependencyManagement> 內(nèi)即可
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.seyvoue.demo</groupId>
  <artifactId> demo-maven </artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>
 
  ...
  <properties>
     <spring.version>4.0.2.RELEASE</spring.version>
     <junit.versoin>4.7</junit.version>
     ...
  </properties>
  
  <!-- 繼承自該項目的所有子項目的默認依賴信息。這部分的依賴信息不會被立即解析,而是當子項目聲明一個依賴(必須描述group ID和 artifact ID信息),如果group ID和artifact 
  ID以外的一些信息沒有描述,則通過group ID和artifact ID 匹配到這里的依賴,并使用這里的依賴信息。-->
  <dependencyManagement>
    <dependencies>
      <dependency>
            <groupId>com.github.brevy</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.2.2</version>
      </dependency>
      ...
    </dependencies>
  </dependencyManagement>
  ...
  
</project> 

  • 子 pom.xml:

<parent>...</parent> 標簽內(nèi)添加 父pom.xml 的坐標

<project>  
    <modelVersion>4.0.0</modelVersion> 
    ... 
    <parent>  
        <groupId>com.seyvoue.demo</groupId>  
        <artifactId> demo-maven </artifactId>  
        <version>1.0.0-SNAPSHOT</version>
        <!-- 父pom.xml文件的相對路徑。相對路徑允許你選擇一個不同的路徑。默認值是../
        pom.xml。Maven首先在構(gòu)建當前項目的地方尋找父pom.xml,其次在文件系統(tǒng)的這個位置(relativePath位置),然后在本地倉庫,最后在遠程倉庫尋找父項目的pom。-->
        <relativePath>...</relativePath>  
    </parent>
    
    <!-- 子 POM 若引用父 POM 在 dependencyManagement 中定義過的依賴,則只需填寫 groupId 和 artifactid,其它的信息則會從父 POM 中繼承 -->
    <dependencies>
        <dependency>
             <groupId>com.github.brevy</groupId>
             <artifactId>shiro-spring</artifactId>
        </dependency>
        ...
    </dependencies>
    
    ...


</project>  

  • Maven 可繼承的 POM 元素:
groupId :項目組 ID ,項目坐標的核心元素;  
version :項目版本,項目坐標的核心元素;  
description :項目的描述信息;  
organization :項目的組織信息;  
inceptionYear :項目的創(chuàng)始年份;  
url :項目的 url 地址  
develoers :項目的開發(fā)者信息;  
contributors :項目的貢獻者信息;  
distributionManagerment :項目的部署信息;  
issueManagement :缺陷跟蹤系統(tǒng)信息;  
ciManagement :項目的持續(xù)繼承信息;  
scm :項目的版本控制信息;  
mailingListserv :項目的郵件列表信息;  
properties :自定義的 Maven 屬性;  
dependencies :項目的依賴配置;  
dependencyManagement :醒目的依賴管理配置;  
repositories :項目的倉庫配置;  
build :包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等;  
reporting :包括項目的報告輸出目錄配置、報告插件配置等。  

1.1.5 屬性:<properties>...</properties> 和 &{}

Maven 的 properties 加載順序:

  • <build><filters> 中的配置
  • pom.xml 中的 <properties>
  • mvn -Dproperty=value 中定義的 property
    相同 key 的 property,以最后一個文件中的配置為最終配置。
<project>
  ...
  <properties>
    <maven.compiler.source>1.7<maven.compiler.source>
    <maven.compiler.target>1.7<maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>
  ...
</project>

通過 properties元素用戶可以定義一個或多個 maven 屬性,然后在 maven 的其他地方使用 ${屬性名稱} 的方式引用該屬性,這種做法的意義在于消除重復(fù)和統(tǒng)一管理。比如,需要在多個地方重復(fù)聲明同樣的 SpringFramework 版本,現(xiàn)在只需要在一個地方聲明就可以。Maven 共有6種屬性(根據(jù)引用的來源不同):內(nèi)置屬性、POM 屬性、自定義屬性、Settings 屬性、環(huán)境變量屬性等,引用方式是類似的,下面介紹其中的集中

  • 內(nèi)置屬性

兩個常用內(nèi)置屬性:

  • ${basedir} 表示項目根目錄
  • ${version} 表示項目版本
  • POM 屬性

用戶可以使用該類屬性引用 pom.xml 中對應(yīng)元素的值,如 ${project.artifactId} 就對應(yīng)了 <project><artifactId></artifactId></project> 中的值。常用的 POM 屬性包括:

  • ${project.build.sourceDirectory} 表示項目的主源碼目錄,默認為 src/main/java
  • ${project.build.testDirectory} 表示項目的測試源碼目錄,默認為 src/test/java
  • ${project.build.directory} 表示項目項目構(gòu)建輸出目錄,默認為 /target
  • ${project.outputDirectory} 表示項目主代碼編譯輸出目錄,默認為 /target/classes
  • ${project.build.filename} 表示項目打包輸出文件的名稱,默認為 ${project.artifactId}-${project.version}
  • 自定義屬性

用戶可以在 pom.xml 的<properties/> 元素下定義自己的 Maven 屬性。如:

<project>
   ...
   <properties>
       <my.group>hello</my.group>
   </properties>
   ...
</project>

  • settings 屬性

與 POM 屬性同理。maven settings.xml 中定義的內(nèi)容,可以通過 settings 前綴進行引用。

${settings.localRepository} 表示 maven 本地倉庫的路徑
${settings.offline} 表示構(gòu)建系統(tǒng)是否在離線模式下工作

1.2 Build Settings

根據(jù) POM 4.0.0 XSD,build 元素概念性的劃分為兩個部分:BaseBuild(包含 poject build 和 profile build 的公共部分,見下)和 poject 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  
                        http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    ...  
    <!-- "Project Build" contains more elements than just the BaseBuild set -->  
    <build>...</build>  
  
  
    <profiles>  
        <profile>  
            <!-- "Profile Build" contains a subset of "Project Build"s elements -->  
            <build>...</build>  
        </profile>  
    </profiles>  
</project>  

1.2.1 <build>...</build>

1.2.1.1 The BaseBuild Element Set
Basic Elements
<build>  
    <defaultGoal>install</defaultGoal>  
    <directory>${basedir}/target</directory>  
    <finalName>${artifactId}-${version}</finalName>  
    <filters>  
        <filter>filters/filter1.properties</filter>  
    </filters>  
    ...  
</build>  

  • defaultGoal:執(zhí)行build任務(wù)時,如果沒有指定目標,將使用的默認值,如:在命令行中執(zhí)行mvn,則相當于執(zhí)行mvn install;
  • directory:build目標文件的存放目錄,默認在 ${basedir}/target目錄
  • finalName:build目標文件的文件名,默認情況下為${artifactId}-${version}
  • filter:定義*.properties文件,包含一個properties列表,該列表會應(yīng)用的支持filter的resources中。也就是說,定義在filter的文件中的"name=value"值對會在build時代替 ${name} 值應(yīng)用到 resources 中。Maven的默認filter文件夾是 ${basedir}/src/main/filters/
<Resources>...</Resources>

Maven 屬性默認只有在 pom.xml 中才會被解析,對于放在 src/main/resources/ 目錄下的文件,maven 是需要通過 maven-resources-plugin 插件幫忙處理的,它默認的行為是將項目資源文件復(fù)制到代碼編譯輸出目錄中,不過只要通過一些簡單的 POM 配置,該插件就能解析資源文件中的 Maven 屬性,即開啟資源過濾。
resources(通常)不是代碼,他們不被編譯,但是被綁定在你的項目或者用于其它什么原因,例如代碼生成。

<build>  
    ...  
    <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:一個resource元素的列表,每一個都描述與項目關(guān)聯(lián)的文件是什么和在哪里;
  • targetPath:指定build后的resource存放的文件夾。該路徑默認是basedir。通常被打包在JAR中的resources的目標路徑為META-INF;
  • filtering:true/false,表示為這個resource,filter是否激活。
  • directory:定義resource所在的文件夾,默認為 ${basedir}/src/main/resources
  • includes:指定作為resource的文件的匹配模式,用 * 作為通配符;
  • excludes:指定哪些文件被忽略,如果一個文件同時符合 includesexcludes,則 excludes生效;
  • testResources:定義和 resource 類似,但只在 test 時使用,默認的 test resource文件夾路徑是 ${basedir}/src/test/resources,test resource 不被部署。
<plugins>...</plugins>

<plugins/> 給出構(gòu)建過程中所用到的插件,以及可以在這個元素下對插件進行配置。

<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>
       <excution>
         <id>echodir</id>
         <goals>
           <goal>run</goal>
         </goals>
         <phase>verify</phase>
         <inherited>false</inherited>
         <configuration>
           <task>
             <echo>Build Dir: ${project.build.directory}</echo>
           </task>
         </configuration>
       </excution>
     </executions>  
   </plugin>  
 </plugins>  
</build>  

  • extensions:是否加載該插件的擴展,默認false
  • inherited:該插件的 configuration 中的配置是否可以被(繼承該POM的其他Maven項目)繼承,默認true
  • configuration:該插件所需要的特殊配置,在父子項目之間可以覆蓋或合并
  • dependencies:該插件所特有的依賴類庫
  • executions:plugin 可以有多個目標,每一個目標都可以有一個分開的配置,甚至可以綁定一個 plugin 的目標到一個不同的階段。executions 配置一個 plugin 的目標的 execution。一個 execution 有如下設(shè)置:
    • id,唯一標識
    • goals,要執(zhí)行的插件的 goal(可以有多個),如 <goal>run</goal>
    • phase,目標執(zhí)行的階段,具體值看Maven的生命周期列表
    • inherited,該 execution 是否可被子項目繼承
    • configuration,該 execution 的其他配置參數(shù)
<pluginManagement>...<pluginManagement>

<build> 中,<pluginManagement><plugins> 并列,兩者之間的關(guān)系類似于 <dependencyManagement><dependencies> 之間的關(guān)系。<pluginManagement> 中也配置 <plugin>,其配置參數(shù)與 <plugins> 中的 <plugin> 完全一致。只是,<pluginManagement> 往往出現(xiàn)在父項目中,其中配置的 <plugin> 往往通用于子項目。子項目中只要在 <plugins> 中以 <plugin> 聲明該插件,該插件的具體配置參數(shù)則繼承自父項目中 <pluginManagement> 對該插件的配置,從而避免在子項目中進行重復(fù)配置。

1.2.2 <reporting>...</reporting>

<reporting> 中的配置作用于 Maven 的 site 階段( 見 Maven 生命周期),用于生成報表。<reporting> 中也可以配置插件 <plugins>,并通過一個 <plugin> 的 <reportSet>為該插件配置參數(shù)。注意,對于同時出現(xiàn)在 <build> 和 <reporting> 中的插件,<reporting> 中對該插件的配置也能夠在構(gòu)建過程中生效,即該插件的配置是<build>和<reporting>中的配置的合并。

1.3 Environment Settings

<SCM>...</SCM>

Maven中為我們集成了軟件配置管理的(SCM:Software Configuration Management)功能,他可以支持我們常用SVN、CVS等,共支持18個命令:

scm:branch - branch the project(創(chuàng)建項目的分支)
scm:validate - validate the scm information in the pom(校驗SCM的配置信息)
scm:add - command to add file(增加一個文件)
scm:unedit - command to stop editing the working copy(停止編輯當前COPY)
scm:export - command to get a fresh exported copy(拉一個全新的分支)
scm:bootstrap - command to checkout and build a project(checkout并編譯工程)
scm:changelog - command to show the source code revisions(顯示源碼版本)
scm:list - command for get the list of project files(列出工程的文件)
scm:checkin - command for commiting changes(提交變更)
scm:checkout - command for getting the source code(獲取源碼)
scm:status - command for showing the scm status of the working copy(獲取本地項目的狀態(tài))
scm:update - command for updating the working copy with the latest changes(從服務(wù)器獲取最新的版本)
scm:diff - command for showing the difference of the working copy with the remote one(比較本地與遠程服務(wù)器的差異)
scm:update-subprojects - command for updating all projects in a multi project build(更新子項目)
scm:edit - command for starting edit on the working copy(編輯)
scm:tag - command for tagging a certain revision(打標簽)
 

tips:而其中的 mvn scm:checkin, mvn scm:update是其中比較常用的命令。

比如,對 git 的配置如下:

<project>

    ...

    <scm>     
        <!--SCM的URL,該URL描述了版本庫和如何連接到版本庫。欲知詳情,請看SCMs提供的URL格式和列表。該連接只讀。-->     
        <connection>     
            scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)      
        </connection>     
        <!--給開發(fā)者使用的,類似connection元素。即該連接不僅僅只讀-->    
        <developerConnection>     
            scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk      
        </developerConnection>    
        <!--當前代碼的標簽,在開發(fā)階段默認為HEAD-->    
        <tag/>           
        <!--指向項目的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL。-->     
        <url>http://svn.baidu.com/banseon</url>     
    </scm> 
    
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
        <version>2.5.3</version>
        <configuration>
            <tagBase>${git.conn}</tagBase>
            <branchBase>${git.conn}</branchBase>
            <username>${git.username}</username>
            <password>${git.password}</password>
        </configuration>
    </plugin>
    
    ...

</project>

<distributionManagement>...</distributionManagement>

maven 中的倉庫分為兩種,snapshot 快照倉庫和 release 發(fā)布倉庫。snapshot 快照倉庫用于保存開發(fā)過程中的不穩(wěn)定版本,release 正式倉庫則是用來保存穩(wěn)定的發(fā)行版本。定義一個組件/模塊為快照版本,只需要在 pom 文件中在該模塊的版本號后加上-SNAPSHOT即可(注意這里必須是大寫),在distributionManagement段中配置的是snapshot快照庫和release發(fā)布庫的地>址。

<project>
  <!--項目分發(fā)信息,在執(zhí)行mvn deploy后表示要發(fā)布的位置。有了這些信息就可以把網(wǎng)站部署到遠程服務(wù)器或者把構(gòu)件部署到遠程倉庫。--> 
  <distributionManagement>
          <!--部署項目產(chǎn)生的構(gòu)件到遠程倉庫需要的信息--> 
          <repository>
              <id>${distribution.releases.id}</id>
              <url>${distribution.releases.url}</url>
          </repository>
          <snapshotRepository>
              <id>${distribution.snapshots.id}</id>
              <url>${distribution.snapshots.url}</url>
          </snapshotRepository>
  </distributionManagement>
</project>

<profiles>...</profiles>

不同環(huán)境的構(gòu)建很可能是不同的,典型的情況就是數(shù)據(jù)庫的配置。要想使得一個構(gòu)建不做任何修改就能在任何環(huán)境下運行,往往是不可能的,為了能讓構(gòu)建在各個環(huán)境下方便地移植,Maven 引入了 profile 的概念,profile 能夠在構(gòu)建的時候選擇性的激活 pom.xml 中的元素。用戶可以使用很多方式激活 profile,以實現(xiàn)構(gòu)建在不同環(huán)境下的移植。

<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">
 ...
 <profiles>
   <profile>
     <id>test</id>
     <activation>...</activation>
     <build>...</build>
     <modules>...</modules>
     <repositories>...</repositories>
     <pluginRepositories>...</pluginRepositories>
     <dependencies>...</dependencies>
     <reporting>...</reporting>
     <dependencyManagement>...</dependencyManagement>
     <distributionManagement>...</distributionManagement>
   </profile>
 </profiles>
</project>

2. 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>
 
  <!-- 項目的全球唯一標識符,通常使用全限定的包名區(qū)分該項目和其他項目。并且構(gòu)建時生成的路徑也是由此生成, 如com.seyvoue.demo生成的相對路徑為:/com/seyvoue/demo--> 
  <groupId>com.seyvoue.demo</groupId>
  <!-- 構(gòu)件的標識符,它和 groupId 一起唯一標識一個構(gòu)件。換句話說,你不能有兩個不同的項目擁有同樣的 artifactId 和 groupId;在某個特定的 groupId 下,artifactId也必須是唯一的。-->
  <artifactId>demo-maven</artifactId>
  <!-- 項目當前版本,格式為:主版本.次版本.增量版本-限定版本號-->
  <version>1.0.0-SNAPSHOT</version>
  <!-- 項目產(chǎn)生的構(gòu)件類型,例如 jar、war、pom 等。插件可以創(chuàng)建他們自己的構(gòu)件類型,所以前面列的不是全部構(gòu)件類型-->
  <packaging>jar</packaging>
  <!-- 項目的名稱,Maven產(chǎn)生的文檔用-->     
  <name>project-demo</name>
  <!-- 項目主頁的URL,Maven產(chǎn)生的文檔用-->
  <url>http://demo.seyvoue.com</url>
  <!-- 項目的詳細描述, Maven 產(chǎn)生的文檔用。當這個元素能夠用HTML格式描述時(例如,CDATA中的文本會被解析器忽略,就可以包含HTML標簽), 不鼓勵使用純文本描述。如果你需要修改產(chǎn)生的web站點的索引頁面,你應(yīng)該修改你自己的索引頁文件,而不是調(diào)整這里的文檔。-->
  <description>A demo of maven project to study maven.</description>
  


  <parent>    
    <!--被繼承的父項目的構(gòu)件標識符-->    
    <artifactId/>    
    <!--被繼承的父項目的全球唯一標識符-->    
    <groupId/>    
    <!--被繼承的父項目的版本-->    
    <version/>    
    <!-- 父項目的pom.xml文件的相對路徑。相對路徑允許你選擇一個不同的路徑。默認值是../pom.xml。Maven首先在構(gòu)建當前項目的地方尋找父項目的pom,其次在文件系統(tǒng)的這個位置(relativePath位置),然后在本地倉庫,最后在遠程倉庫尋找父項目的pom。-->    
    <relativePath/>    
 </parent>


  <!-- 繼承自該項目的所有子項目的默認依賴信息。這部分的依賴信息不會被立即解析,而是當子項目聲明一個依賴(必須描述group ID和 artifact ID信息),如果group ID和artifact ID以外的一些信息沒有描述,則通過group ID和artifact ID 匹配到這里的依賴,并使用這里的依賴信息。-->    
  <dependencyManagement>    
    <dependencies>    
      <!--參見dependencies/dependency元素-->    
      <dependency>    
      ...    
      </dependency>    
    </dependencies>    
 </dependencyManagement>



  <!--該元素描述了項目相關(guān)的所有依賴。 這些依賴組成了項目構(gòu)建過程中的一個個環(huán)節(jié)。它們自動從項目定義的倉庫中下載。要獲取更多信息,請看項目依賴機制。-->     
  <dependencies>     
    <dependency>    
      <!--依賴的group ID-->    
      <groupId>org.apache.maven</groupId>     
      <!--依賴的artifact ID-->    
      <artifactId>maven-artifact</artifactId>     
      <!--依賴的版本號。 在Maven 2里, 也可以配置成版本號的范圍。-->    
      <version>3.8.1</version>     
      <!-- 依賴類型,默認類型是jar。它通常表示依賴的文件的擴展名,但也有例外。一個類型可以被映射成另外一個擴展名或分類器。類型經(jīng)常和使用的打包方式對應(yīng),   這也有例外。一些類型的例子:jar,war,ejb-client和test-jar。如果設(shè)置extensions為 true,就可以在 plugin里定義新的類型。所以前面的類型的例子不完整。-->    
      <type>jar</type>    
      <!-- 依賴的分類器。分類器可以區(qū)分屬于同一個POM,但不同構(gòu)建方式的構(gòu)件。分類器名被附加到文件名的版本號后面。例如,如果你想要構(gòu)建兩個單獨的構(gòu)件成 JAR,一個使用Java    4編譯器,另一個使用Java 6編譯器,你就可以使用分類器來生成兩個單獨的JAR構(gòu)件。-->    
      <classifier></classifier>    
      <!--依賴范圍。在項目發(fā)布過程中,幫助決定哪些構(gòu)件被包括進來。欲知詳情請參考依賴機制。    
        - compile :默認范圍,用于編譯      
        - provided:類似于編譯,但支持你期待jdk或者容器提供,類似于classpath      
        - runtime: 在執(zhí)行時需要使用      
        - test:    用于test任務(wù)時使用      
        - system: 需要外在提供相應(yīng)的元素。通過systemPath來取得      
        - systemPath: 僅用于范圍為system。提供相應(yīng)的路徑      
        - optional:   當項目自身被依賴時,標注依賴是否傳遞。用于連續(xù)依賴時使用-->     
      <scope>test</scope>       
      <!--僅供system范圍使用。注意,不鼓勵使用這個元素,并且在新的版本中該元素可能被覆蓋掉。該元素為依賴規(guī)定了文件系統(tǒng)上的路徑。需要絕對路徑而不是相對路徑。推薦使用屬性匹配絕對路徑,例{java.  home}。-->    
      <systemPath></systemPath>     
      <!--當計算傳遞依賴時, 從依賴構(gòu)件列表里,列出被排除的依賴構(gòu)件集。即告訴maven你只依賴指定的項目,不依賴項目的依賴。此元素主要用于解決版本沖突問題-->    
      <exclusions>    
        <exclusion>     
          <artifactId>spring-core</artifactId>     
          <groupId>org.springframework</groupId>     
        </exclusion>     
      </exclusions>       
      <!--可選依賴,如果你在項目B中把C依賴聲明為可選,你就需要在依賴于B的項目(例如項目A)中顯式的引用對C的依賴??蛇x依賴阻斷依賴的傳遞性。-->     
      <optional>true</optional>    
    </dependency>
    ...    
  </dependencies>




  <!--模塊(有時稱作子項目) 被構(gòu)建成項目的一部分。列出的每個模塊元素是指向該模塊的目錄的相對路徑-->
  <modules>  
      <module>account-email</module>  
      <module>account-persist</module> 
      ... 
  </modules>





  <scm>     
      <!--SCM的URL,該URL描述了版本庫和如何連接到版本庫。欲知詳情,請看SCMs提供的URL格式和列表。該連接只讀。-->     
      <connection>     
          scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)      
      </connection>     
      <!--給開發(fā)者使用的,類似connection元素。即該連接不僅僅只讀-->    
      <developerConnection>     
          scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk      
      </developerConnection>    
      <!--當前代碼的標簽,在開發(fā)階段默認為HEAD-->    
      <tag/>           
      <!--指向項目的可瀏覽SCM庫(例如ViewVC或者Fisheye)的URL。-->     
      <url>http://svn.baidu.com/banseon</url>     
  </scm> 
  

  <!--項目分發(fā)信息,在執(zhí)行mvn deploy后表示要發(fā)布的位置。有了這些信息就可以把網(wǎng)站部署到遠程服務(wù)器或者把構(gòu)件部署到遠程倉庫。-->     
  <distributionManagement>    
    <!--部署項目產(chǎn)生的構(gòu)件到遠程倉庫需要的信息-->    
      <repository>    
        <!--是分配給快照一個唯一的版本號(由時間戳和構(gòu)建流水號)?還是每次都使用相同的版本號?參見repositories/repository元素-->    
        <uniqueVersion/>    
        <id>banseon-maven2</id>     
        <name>banseon maven2</name>     
          <url>file://${basedir}/target/deploy</url>     
          <layout/>    
      </repository>    
      <!--構(gòu)件的快照部署到哪里?如果沒有配置該元素,默認部署到repository元素配置的倉庫,參見distributionManagement/repository元素-->     
      <snapshotRepository>    
        <uniqueVersion/>    
        <id>banseon-maven2</id>    
          <name>Banseon-maven2 Snapshot Repository</name>    
          <url>scp://svn.baidu.com/banseon:/usr/local/maven-snapshot</url>     
        <layout/>    
      </snapshotRepository>    
      <!--部署項目的網(wǎng)站需要的信息-->     
      <site>    
    <!--部署位置的唯一標識符,用來匹配站點和settings.xml文件里的配置-->     
        <id>banseon-site</id>     
          <!--部署位置的名稱-->    
          <name>business api website</name>     
          <!--部署位置的URL,按protocol://hostname/path形式-->    
          <url>     
            scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web      
          </url>     
      </site>    
      <!--項目下載頁面的URL。如果沒有該元素,用戶應(yīng)該參考主頁。使用該元素的原因是:幫助定位那些不在倉庫里的構(gòu)件(由于license限制)。-->    
      <downloadUrl/>    
      <!--如果構(gòu)件有了新的group ID和artifact ID(構(gòu)件移到了新的位置),這里列出構(gòu)件的重定位信息。-->    
      <relocation>    
        <!--構(gòu)件新的group ID-->    
        <groupId/>    
        <!--構(gòu)件新的artifact ID-->    
        <artifactId/>    
        <!--構(gòu)件新的版本號-->    
        <version/>    
        <!--顯示給用戶的,關(guān)于移動的額外信息,例如原因。-->    
        <message/>    
      </relocation>    
      <!-- 給出該構(gòu)件在遠程倉庫的狀態(tài)。不得在本地項目中設(shè)置該元素,因為這是工具自動更新的。有效的值有:none(默認),converted(倉庫管理員從 Maven 1  POM轉(zhuǎn)換過來),partner(直接從伙伴Maven 2倉庫同步過來),deployed(從Maven 2實例部 署),verified(被核實時正確的和最終的)。-->    
      <status/>           
  </distributionManagement>

  <build>
    <!--當項目沒有規(guī)定目標(Maven2 叫做階段)時的默認值-->
    <defaultGoal>install</defaultGoal>
    <!--build目標文件的存放目錄,默認在 ${basedir}/target 目錄-->
    <directory>${basedir}/target</directory>
    <finalName>${artifactId}-${version}</finalName>
    <filters>
      <filter>filters/filter1.properties</filter>
    </filters>

    <!--這個元素描述了項目相關(guān)的所有資源路徑列表,例如和項目相關(guān)的屬性文件,這些資源被包含在最終的打包文件里。-->    
    <resources>    
      <!--這個元素描述了項目相關(guān)或測試相關(guān)的所有資源路徑-->    
      <resource>    
        <!-- 描述了資源的目標路徑。該路徑相對target/classes目錄(例如${project.build.outputDirectory})。舉個例 子,如果你想資源在特定的包里(   org.apache.maven.message,你就必須該元素設(shè)置為org/apache/maven /messages。然而,如果你只是想把資源放到源碼目錄結(jié)構(gòu)里,就不需要該配置。-->    
        <targetPath/>    
        <!--是否使用參數(shù)值代替參數(shù)名。參數(shù)值取自properties元素或者文件里配置的屬性,文件在filters元素里列出。-->    
        <filtering/>    
        <!--描述存放資源的目錄,該路徑相對POM路徑-->    
        <directory/>    
        <!--包含的模式列表,例如**/*.xml.-->    
        <includes/>    
        <!--排除的模式列表,例如**/*.xml-->    
        <excludes/>    
      </resource>    
    </resources>    
    <!--這個元素描述了單元測試相關(guān)的所有資源路徑,例如和單元測試相關(guān)的屬性文件。-->    
    <testResources>    
      <!--這個元素描述了測試相關(guān)的所有資源路徑,參見build/resources/resource元素的說明-->    
      <testResource>    
        <targetPath/>
        <filtering/>
        <directory/>
        <includes/>
        <excludes/>    
      </testResource>    
    </testResources>

    <plugins>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.5.3</version>
          <configuration>
              <tagBase>${git.conn}</tagBase>
              <branchBase>${git.conn}</branchBase>
              <username>${git.username}</username>
              <password>${git.password}</password>
          </configuration>
      </plugin>
      ...
    </plugins>

    <!--子項目可以引用的默認插件信息。該插件配置項直到被引用時才會被解析或綁定到生命周期。給定插件的任何本地配置都會覆蓋這里的配置-->
    <pluginManagement>
      <plugins>
        ...
      </plugins>
    </pluginManagement>

  </build>

</project>


參考

  1. POM Reference -- Apache Maven Project
  2. pom.xml 詳解 -- adeyi
  3. Maven實戰(zhàn) -- 許曉斌
  4. dependency 中的 classifier屬性
  5. 利用maven的filter和profile實現(xiàn)不同環(huán)境使用不同的配制
  6. 使用 maven profile
  7. Maven多環(huán)境配置實戰(zhàn) filter
  8. Maven Dependency Scope
  9. Maven基本命令 倉庫 坐標 依賴 聚合 繼承 pom.xml詳解
  10. Maven pom.xml 配置詳解
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,694評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,285評論 6 342
  • 當前,JVM生態(tài)圈主要的三大構(gòu)建工具: Apache Ant(帶著Ivy) Maven Gradle 對于剛開始接...
    清楓_小天閱讀 5,994評論 1 13
  • 第一次用簡書,希望找到一塊凈土,告別朋友圈說說,找到一塊沒有自己熟識的朋友的土地,來寫寫自己的生活,和不認識的朋友...
    田戲戲的喜劇生活閱讀 304評論 0 0
  • 可以通過點擊官方鏈接查看詳細信息 官方提供的API列表如下: interfaces– Core gensim in...
    Midorra閱讀 2,611評論 0 0

友情鏈接更多精彩內(nèi)容