POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,XML格式,名称为pom.xml,作用类似ant的build.xml文件,功能则更强大。
该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。
事实上在Maven的世界中,一个项目可以什么都没有,甚至没有代码,但是必须包含pom.xml文件。
1 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 简单示例
一个最简单的pom.xml的定义必须包含modelVersion、groupId、artifactId和version这四个元素,当然这其中的元素也是可以从它的父项目中继承的。
在maven中,使用groupId、artifactId和version组成groupId: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>
<groupId>otowa.user.dao</groupId>
<artifactId>user-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>maven</name>
</project>
说明如下:
(1)<groupId>otowa.user.dao</groupId>
含义:组织标识,定义了项目属于哪个组,风向标,坐标。
用途:此名称则是本地仓库中的路径,列如:otowa.user.dao,
在M2_REPO目录下,将是: otowa/user/dao目录。
命名规范:项目名称,模块,子模块。
(2)<artifactId>user-dao</artifactId>
含义:项目名称也可以说是模块名称,定义当面Maven项目在组中唯一的ID。
用途:例如:user-dao,
在M2_REPO目录下,将是:otowa/user/dao/user-dao目录。
命名规范:唯一即可。
(3)<version>0.0.1-SNAPSHOT</version>
含义:项目当前的版本号
用途:例如:0.0.1-SNAPSHOT,
在M2_REPO目录下,将是:otowa/user/dao/user-dao/0.0.1-SNAPSHOT目录
(4)<packaging>war</packaging>
打包的格式,可以为:pom,jar,maven-plugin,ejb,war,ear,rar,par。
(5)<name>maven</name>
声明了一个对用户更为友好的项目名称。
1.2 详细示例
<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 ">
(1)第一项parent
<!-- 父项目的坐标。
如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。
坐标包括group ID,artifact ID和 version。
-->
<parent>
<!-- 被继承的父项目的构件标识符 -->
<artifactId />
<!-- 被继承的父项目的全球唯一标识符 -->
<groupId />
<!-- 被继承的父项目的版本 -->
<version />
<!-- 父项目的pom.xml文件的相对路径。
相对路径允许你选择一个不同的路径。
默认值是../pom.xml。
Maven首先在构建当前项目的地方寻找父项目的pom,
其次在文件系统的这个位置(relativePath位置),
然后在本地仓库,最后在远程仓库寻找父项目的pom。
-->
<relativePath />
</parent>
(2)第二项modelVersion
<!-- 声明项目描述符遵循哪一个POM模型版本。
模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,
这是为了当Maven引入了新的特性或者其他模型变更的时候,确保稳定性。
-->
<modelVersion> 4.0.0 </modelVersion>
(3)第三项groupId
<!-- 项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。
并且构建时生成的路径也是由此生成,
如com.mycompany.app生成的相对路径为:/com/mycompany/app。
-->
<groupId> asia.banseon </groupId>
(4)第四项artifactId
<!-- 构件的标识符,它和group ID一起唯一标识一个构件。
换句话说,你不能有两个不同的项目拥有同样的artifact ID和groupID;
在某个特定的group ID下,artifact ID也必须是唯一的。
构件是项目产生的或使用的一个东西,
Maven为项目产生的构件包括:JARs,源码,二进制发布和WARs等。
-->
<artifactId> banseon-maven2 </artifactId>
(5)第五项packaging
<!-- 项目产生的构件类型,例如jar、war、ear、pom。
插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型。
-->
<packaging> jar </packaging>
(6)第六项version
<!-- 项目当前版本,格式为:主版本.次版本.增量版本-限定版本号。
-->
<version> 1.0-SNAPSHOT </version>
(7)第七项name
<!-- 项目的名称, Maven产生的文档用 -->
<name> banseon-maven </name>
(8)第八项url
<!-- 项目主页的URL, Maven产生的文档用 -->
<url> http://www.baidu.com/banseon </url>
(9)第九项description
<!-- 项目的详细描述, Maven 产生的文档用。
当这个元素能够用HTML格式描述时(例如,CDATA中的文本会被解析器忽略,
就可以包含HTML标签),不鼓励使用纯文本描述。
如果你需要修改产生的web站点的索引页面,你应该修改你自己的索引页文件,
而不是调整这里的文档。
-->
<description> A maven project to study maven. </description>
(10)第十项prerequisites
<!-- 描述了这个项目构建环境中的前提条件。 -->
<prerequisites>
<!-- 构建该项目或使用该插件所需要的Maven的最低版本 -->
<maven />
</prerequisites>
(11)第十一项issueManagement
<!-- 项目的问题管理系统(Bugzilla, Jira, Scarab,
或任何你喜欢的问题管理系统)的名称和URL,本例为 jira -->
<issueManagement>
<!-- 问题管理系统(例如jira)的名字, -->
<system> jira </system>
<!-- 该项目使用的问题管理系统的URL -->
<url> http://jira.baidu.com/banseon </url>
</issueManagement>
(12)第十二项ciManagement
<!-- 项目持续集成信息 -->
<ciManagement>
<!-- 持续集成系统的名字,例如continuum -->
<system />
<!-- 该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 -->
<url />
<!-- 构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) -->
<notifiers>
<!-- 配置一种方式,当构建中断时,以该方式通知用户/开发者 -->
<notifier>
<!-- 传送通知的途径 -->
<type />
<!-- 发生错误时是否通知 -->
<sendOnError />
<!-- 构建失败时是否通知 -->
<sendOnFailure />
<!-- 构建成功时是否通知 -->
<sendOnSuccess />
<!-- 发生警告时是否通知 -->
<sendOnWarning />
<!-- 不赞成使用。通知发送到哪里 -->
<address />
<!-- 扩展配置项 -->
<configuration />
</notifier>
</notifiers>
</ciManagement>
(13)第十三项inceptionYear
<!-- 项目创建年份,4位数字。当产生版权信息时需要使用这个值。 -->
<inceptionYear />
(14)第十四项mailingLists
<!-- 项目相关邮件列表信息 -->
<mailingLists>
<!-- 该元素描述了项目相关的所有邮件列表。自动产生的网站引用这些信息。 -->
<mailingList>
<!-- 邮件的名称 -->
<name> Demo </name>
<!-- 发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->
<post> banseon@126.com </post>
<!-- 订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->
<subscribe> banseon@126.com </subscribe>
<!-- 取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 -->
<unsubscribe> banseon@126.com </unsubscribe>
<!-- 你可以浏览邮件信息的URL -->
<archive> http:/hi.baidu.com/banseon/demo/dev/ </archive>
</mailingList>
</mailingLists>
(15)第十五项developers
<!-- 项目开发者列表 -->
<developers>
<!-- 某个项目开发者的信息 -->
<developer>
<!-- SCM里项目开发者的唯一标识符 -->
<id> HELLO WORLD </id>
<!-- 项目开发者的全名 -->
<name> banseon </name>
<!-- 项目开发者的email -->
<email> banseon@126.com </email>
<!-- 项目开发者的主页的URL -->
<url />
<!-- 项目开发者在项目中扮演的角色,角色元素描述了各种角色 -->
<roles>
<role> Project Manager </role>
<role> Architect </role>
</roles>
<!-- 项目开发者所属组织 -->
<organization> demo </organization>
<!-- 项目开发者所属组织的URL -->
<organizationUrl> http://hi.baidu.com/banseon </organizationUrl>
<!-- 项目开发者属性,如即时消息如何处理等 -->
<properties>
<dept> No </dept>
</properties>
<!-- 项目开发者所在时区, -11到12范围内的整数。 -->
<timezone> -5 </timezone>
</developer>
</developers>
(16)第十六项contributors
<!-- 项目的其他贡献者列表 -->
<contributors>
<!-- 项目的其他贡献者。参见developers/developer元素 -->
<contributor>
<name />
<email />
<url />
<organization />
<organizationUrl />
<roles />
<timezone />
<properties />
</contributor>
</contributors>
(17)第十七项licenses
<!-- 该元素描述了项目所有License列表。
应该只列出该项目的license列表,不要列出依赖项目的 license列表。
如果列出多个license,用户可以选择它们中的一个而不是接受所有license。
-->
<licenses>
<!-- 描述了项目的license,用于生成项目的web站点的license页面,
其他一些报表和validation也会用到该元素。
-->
<license>
<!-- license用于法律上的名称 -->
<name> Apache 2 </name>
<!-- 官方的license正文页面的URL -->
<url> http://www.baidu.com/banseon/LICENSE-2.0.txt </url>
<!-- 项目分发的主要方式: repo,可以从Maven库下载 manual,
用户必须手动下载和安装依赖 -->
<distribution> repo </distribution>
<!-- 关于license的补充信息 -->
<comments> A business-friendly OSS license </comments>
</license>
</licenses>
(18)第十八项scm
<!-- SCM(Source Control Management)标签允许你配置你的代码库,
供Maven web站点和其它插件使用。
-->
<scm>
<!-- SCM的URL,该URL描述了版本库和如何连接到版本库。
欲知详情,请看SCMs提供的URL格式和列表。该连接只读。
-->
<connection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk)
</connection>
<!-- 给开发者使用的,类似connection元素。即该连接不仅仅只读 -->
<developerConnection>
scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk
</developerConnection>
<!-- 当前代码的标签,在开发阶段默认为HEAD -->
<tag />
<!-- 指向项目的可浏览SCM库(例如ViewVC或者Fisheye)的URL。 -->
<url> http://svn.baidu.com/banseon </url>
</scm>
(19)第十九项organization
<!-- 描述项目所属组织的各种属性。Maven产生的文档用 -->
<organization>
<!-- 组织的全名 -->
<name> demo </name>
<!-- 组织主页的URL -->
<url> http://www.baidu.com/banseon