[Maven]-pom.xml文件详解

一、概述

  当我们使用Maven来管理和构建我们的项目的时候,我们会不可避免的遇到pom文件。虽然已经配置过pom.xml好多次,但一直没有系统的学习过,现在回过头来准备再系统的学习下。

首先,我们先看下官网文档:Apache Maven Project - Introduction to the POM,本文的所有内容基本都是基于官网文档来的。

  A Project Object Model or POM is the fundamental unit of work in Maven. It is an XML file that contains information about the project and configuration details used by Maven to build the project. It contains default values for most projects. Examples for this is the build directory, which is target; the source directory, which is src/main/java; the test source directory, which is src/test/java; and so on.
  The POM was renamed from project.xml in Maven 1 to pom.xml in Maven 2. Instead of having a maven.xml file that contains the goals that can be executed, the goals or plugins are now configured in the pom.xml. When executing a task or goal, Maven looks for the POM in the current directory. It reads the POM, gets the needed configuration information, then executes the goal.
  Some of the configuration that can be specified in the POM are the project dependencies, the plugins or goals that can be executed, the build profiles, and so on. Other information such as the project version, description, developers, mailing lists and such can also be specified.

通过介绍,我们大致了解下:

POM(Project Object Model,即项目对象模型)是Maven工程的基本工作单元,是一个XML文件,包含了Maven用于构建项目的项目信息及各种配置信息,比如项目依赖,项目开发人员,版本,插件,组织信息、项目授权、项目的 url等等。我们通过POM文件来完成对Maven项目的管理,构建等操作。

二、pom文件节点

pom.xml文件的节点大致可以分为以下几个部分:


    4.0.0

    
    ...
    ...
    ...
    ...

    
    ...
    ...
    ...
    ...
    ...

    
    ...
    ...

    
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...

    
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...
    ...

接下来,我们就这几个部分进行挨个学习。

1. 基础配置信息

   
   4.0.0
   
   com.company.bank
   
   parent
   
   0.0.1-SNAPSHOT
   
   war

pom.xml文件中,最外层的标签是project标签,该标签定义了如下属性:

  1. xmlns属性:表明了该标签下元素的默认命名空间是:http://maven.apache.org/POM/4.0.0,xml文件中,定义命名空间的格式为:xmlns:namespace-prefix="namespaceURI",而定义默认命名空间的格式为:xmlns="namespaceURI";
  2. xmlns:xsi属性:定义了一个namespace-prefix,其代表的命名空间URI为:http://www.w3.org/2001/XMLSchema-instance,定义该命名空间主要是为了更方便的使用其所代表的命名空间中的schemaLocation属性;其中,使用xsi作为namespace-prefix,并不是硬性规定,只是一种通用的选择,当然也可以改成别的命名;
  3. xsi:schemaLocation属性:该属性的使用格式为:xsi:schemaLocation="namespaceURI1 schemaURI1 namespaceURI2 schemaURI2 ...",这里是说使用schemaURI1所对应的schema文件,校验命名空间namespaceURI1下的元素是否符合XML语法规范,后面的则是以此类推。

再来看一下基础信息的几个节点:

节点 对应的解释
modelVersion pom模型版本,根据官方文档,Maven2和3只能为4.0.0
groupId 项目组id,表明该项目所属的组织或公司,命名规则通常为组织或公司域名反转,然后再加项目名称
artifactId 项目的id,有时候和项目名保持一致,有时候是项目名 + 模块名,该id是唯一的,一个goupId下面可能会有多个artifactId,就是通过artifactId区分。比如:consumer-banking
version 当前项目的版本号,一般是:大版本.小版本.增量版本-限定版本号SHAPSHOT意为快照,说明该项目还处于开发中
packaging 项目的打包方式,常用可选值:pom, jar, ejb, maven-plugin, war, ear, rar, par等,默认方式为jar
2. 项目信息

下面再来看下项目的一些信息:

节点 对应的解释
name 声明了一个对于用户更加友好的项目名称,非必须项,一般用于Maven生成的文档
description 项目的详细描述信息,能使用HTML格式描述时不建议使用纯文本来描述, 一般用于Maven生成的文档
url 项目主页的url,一般用于Maven生成的文档
inceptionYear 项目开始的年份,一般是4位数字,涉及到介绍情况时用作提供版权信息
licenses 当前项目所有的许可文件,每一个许可文件用一个许可元素来描述,然后描述额外的元素。 通常只列出适用于这个项目的许可文件,无需列出依赖项目的 许可文件列表。如果列出多个license,那么用户可以选择其中所需的,而不是接受所有的许可文件。
organization 组织相关信息
developers 项目开发人员列表
contributors 项目其他贡献者列表,同developers

licenses列表:

    
        
    ...     
        
    ....
        
    repo     
        
    ....     

organization属性:


    
    ...
    
    ...

developers属性:

  
    
      
        
        ....  
        
        ...  
        
        ...  
        
        ...
        
          
            Java Dev  
            Web UI  
         
         
        sun  
        
        ...  
        
        
        
         
         
        -5  
      

contributors属性:


    
        ...
    

3. 依赖配置
  1. dependencies:项目相关依赖,如果父项目中的依赖,会被子项目引用,所以一般在父项目中定义子项目中共有的依赖。并且如果有需要,子项目可以修改所依赖包的版本:

    
            junit
            junit
            4.12
    

  1. parent:用于确定父项目的坐标位置。

    com.learnPro
    SIP-parent
    
    0.0.1-SNAPSHOT

  • groupId: 父项目的组Id标识符
  • artifactId:父项目的唯一标识符
  • relativePath:Maven首先在当前项目中找父项目的pom,然后在文件系统的这个位置(relativePath)查找,然后在本地仓库查找,再在远程仓库找。
  • version:父项目的版本
  1. dependencyManagement:用于帮助管理children的依赖。例如如果parent使用dependencyManagement定义了一个junit:junit4.0,那么它的children就可以只引用 groupId和artifactId,而version就可以直接使用父模块的,如果有需要,我们也可以设置version,这样的好处就是可以集中管理依赖的详情,并且也更灵活。
      不过dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。配置同dependencies类似;


    
        
            junit
            junit
            4.12
            test
        
    



    junit
    junit

dependencies几个重要的属性介绍:

  1. type属性,依赖的类型,默认为jar,指定pom,可以定义整个pom文件;
  2. scope属性,当前包的依赖范围,用于限制依赖项的传递性,通过控制依赖的范围,可以指定该依赖在什么阶段有效。该属性共有5个值,默认是compile,也就是依赖关系在包含编译,测试,运行的所有类路径中都是可用的。而比如provided,则是依赖关系在编译和测试阶段的类路径中是可用的。如需查看全部,可参考:Introduction to the Dependency Mechanism -Dependency Scope
  3. optional属性,因为依赖是具有传递性的,例如 Project A 依赖于 Project B,B 依赖于 C,那么 B 对 C 的依赖关系也会传递给 A,如果我们不需要这种传递性依赖,就可以通过设置该属性的值。默认为false,即子项目默认都继承,true的话子项目必须显示的引入,与dependencyManagement里定义的依赖类似;
  4. exclusions和exclusion属性,用于移除项目依赖相关,如果项目X需要A,而A包含B依赖,那么X可以声明不要B依赖,只要在exclusions中声明exclusion,将B从依赖树中删除即可。这一般用于解决jar包冲突的问题;

    
        com.alibaba.china.shared
        alibaba.apollo.webx
        2.5.0
        
          
            org.slf4j.slf4j-api
            com.alibaba.external
          
        
    

  1. modules:Maven项目的一大特点就是以多模块著称,该标签就是用于指定当前项目所包含的模块,对该模块进行的Maven操作,会让所有子模块也进行相应的操作;

   com-a
   com-b
   com-c

  1. properties:该标签用于定义pom文件中的常量,这样,在pom文件的任何地方,都可以通过${java.version}来引用该值;

    
    3.2.6



    com.alibaba.rocketmq
    rocketmq-client
    ${rocketmq.version}

4. 构建配置
  1. 所谓的build,也就是项目构建。在构建配置的过程中,一般包含两个部分,一个是,另一个是;而在Maven的pom.xml中build又分为两种,一种被称为Project Build,也就是下的直接子元素,另一种被称为Profile Build,即是的直接子元素。Profile Build包含了基本的build元素,而Project Build还包含两个特殊的元素,即各种<...Directory>和

    
    
    
    
    
    
    
    
    
    
    
    
        
        
            
            
            
            
            
            
        
    
    
    
    
    
        
        
            
            
            
            
            
            
            
            
            
            
        
    
    
    
        
        
            
            
            
            
            
        
    
    
    
    
    
    
    
    
    
        
        
            
            
                
                
                
                
                
                
                
                
                
                
                    
                    
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                    
                
                
                
                    
                    
                        ......
                    
                
                
                
                
                
            
        
    
    
    
        
        
            
            
            
            
            
                
                    
                    
                    
                    
                    
                
            
            
                
                
                    ......
                
            
            
            
            
        
    

  1. reporting,该元素描述使用报表插件产生报表的规范。当用户执行“mvn site”,这些报表就会运行。 在页面导航栏能看到所有报表的链接。

    
    
    
    
    
    
        
        
            
            
            
            
            
            
            
            
            
            
            
            
                
                
                    
                    
                    
                    
                    
                    
                    
                    
                
            
        
    

5. 环境配置
  1. issueManagement:用于缺陷系统的跟踪与管理,比如Bugzilla, Jira等管理工具:
 
    Bugzilla 
    http://127.0.0.1/bugzilla/ 
 
  1. ciManagement:项目的持续集成信息:

    continuum
    http://127.0.0.1:8080/continuum
    
        
            mail
            true
            true
            false
            false
            
[email protected]
  1. system:持续集成系统的名字
  2. url:持续集成系统的URL
  3. notifiers:构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告)
  • type:通知方式
  • sendOnError:错误时是否通知
  • sendOnFailure:失败时是否通知
  • sendOnSuccess:成功时是否通知
  • sendOnWarning:警告时是否通知
  • address:通知发送到的地址
  • configuration:扩展项
  1. mailingLists:项目相关邮件列表:

    
      User List
      [email protected]
      [email protected]
      [email protected]
      http://127.0.0.1/user/
      
        http://base.google.com/base/1/127.0.0.1
      
    
    .....

  1. subscribe, unsubscribe: 订阅邮件(取消订阅)的地址或链接,如果是邮件地址,创建文档时,链接会被自动创建;
  2. archive:浏览邮件信息的URL;
  3. post:接收邮件的地址;
  1. SCM:(Source Control Management),该标签允许你配置你的代码库,供Maven Web站点和其他插件使用。

    scm:svn:http://127.0.0.1/svn/my-project
    scm:svn:https://127.0.0.1/svn/my-project
    HEAD
    http://127.0.0.1/websvn/my-project

  • connection, developerConnection:这两个表示我们如何连接到maven的版本库。connection只提供读,developerConnection将提供写的请求;写法如:scm:[provider]:[provider_specific],如果连接到CVS仓库,可以配置如下:
    scm:cvs:pserver:127.0.0.1:/cvs/root:my-project
  • tag:项目标签,默认HEAD
  • url:共有仓库路径
  1. prerequisites:项目构建的前提。

    2.0.6

  1. repositoriespluginRepositories,依赖和扩展的远程仓库列表;pom里面的仓库与setting.xml里的仓库功能是一样的。主要的区别在于,pom里的仓库是个性化的。比如一家大公司里的setting文件是公用 的,所有项目都用一个setting文件,但各个子项目却会引用不同的第三方库,所以就需要在pom里设置自己需要的仓库地址。而pluginRepositories,与Repositories具有类似的结构,只是Repositories是dependencies的home,而这个是plugins 的home。

    
      
        false
        always
        warn
      
      
        true
        never
        fail
      
      codehausSnapshots
      Codehaus Snapshots
      http://snapshots.maven.codehaus.org/maven2
      default
    
  
  
    ...
  
  • releases,snapshots:这是各种构件的策略,release或者snapshot,这两个集合,POM就可以根据独立仓库任意类型的依赖改变策略。如:一个人可能只激活下载snapshot用来开发。
  • enable:true或者false,决定仓库是否对于各自的类型激活(release 或者 snapshot)。
  • updatePolicy: 这个元素决定更新频率。maven将比较本地pom的时间戳(存储在仓库的maven数据文件中)和远程的。有以下选择: always, daily (默认), interval:X (x是代表分钟的整型) , never。
  • checksumPolicy:当Maven向仓库部署文件的时候,它也部署了相应的校验和文件。可选的为:ignore,fail,warn,或者不正确的校验和。
  • layout:在上面描述仓库的时候,提到他们有统一的布局。Maven 2有它仓库默认布局。然而,Maven 1.x有不同布局。使用这个元素来表明它是default还是legacy。
  1. profiles:POM 4.0的一个新特性是一个项目能够根据所构建的环境改变设置。通过profiles,我们可以指定构建的环境是开发,测试,UAT,生产等环境;

  ...
  
    
      test
      ...
      ...
      ...
      ...
      ...
      ...
      ...
      ...
      ...
    
  

我们可以通过activation标签来激活相应的profile,也就是指定要构建的默认的环境,并且可以配置各种需要的环境,并且激活profile的方式也有多种,具体参数可查看官网文档。


  ...
  
    
      test
      
        false
        1.5
        
          Windows XP
          Windows
          x86
          5.1.2600
        
        
          sparrow-type
          African
        
        
          ${basedir}/file2.properties
          ${basedir}/file1.properties
        
      
      ...
    
  

三、 总结

在上文中,我们介绍了maven中pom文件的各种配置,其中还有一些没有学习到,这些可以等我们有需要的时候再了解不迟,如果要学习,可以通过本文尾部的官网地址。

参考资料:
maven之pom.xml配置文件详解
Apache Maven Project - POM Reference
IBM开发者社区-用 Maven 做项目构建

你可能感兴趣的:([Maven]-pom.xml文件详解)