pom.xml之(三)

 

POM

Maven项目,依赖,构建配置,以及构件:所有这些都是要建模和表述的对象。这些对象通过一个名为项目对象模型 (Project Object Model, POM )的XML 文件描述。这个POM 告 诉Maven它正处理什么类型的项目,如何修改默认的行为来从源码生成输出。同样的方式,一个Java Web应用有一个web.xml 文件来描述,配置,及自 定义该应用,一个Maven项目则通过一个 pom.xml 文 件定义。该文件是Maven中一个项目的描述性陈述;也是当Maven构建项目的时候需要理解的一份“地图”。

你可以将pom.xml 看成是类似于Makefile 或者Ant中的build.xml 。 当你使用GNU make 来构建诸如MySQL软件的时候,你通常会有一个名为Makefile 的文件,它包含了显 式的指令来清理,编译,打包以及部署一个应用。在这一点上,Make,Ant,和Maven是相似的,它们都依赖于一个统一命名的文件如Makefilebuild.xml , 或者pom.xml ,但相似的地方也仅此而已。如果你看一下Maven的pom.xmlPOM 的主 要内容是处理描述信息:哪里存放源代码?哪里存放资源文件?打包方式是什么?如果你看一下Ant的build.xml 文 件,你会看到完全不同的东西。那里有显式的指令来执行一些任务,如编译一组Java类。Maven的POM 是 声明性的,虽然你可以通过Maven Ant插件来引入一些过程式的自定义指令,但大部分时间里,你不需要去了解项目构建的过程细节。

POM也不只是仅仅针对于构建Java项目。虽然本书的大部分样例都是Java应用,但是在Maven的项目对象模型定义中没有 任何Java特定的东西。虽然Maven的默认插件是从一组源码,测试,和资源来构建一个JAR 文 件。但你同样可以为一个包含C#源码,使用微软工具处理一些微软私有的二进制文件的项目来定义一个POM 。 类似的,你也可以为一本技术书籍定义一个POM 。事实上,本书的源码和本书的样 例正是用一个Maven多模块项目组织的,我们使用一个Maven Docbook插件,将标准的Docbook XSL 应用到一系列章节的XML 文件上。还有人编写了Maven插件来将Adobe Flex代码构建成SWCSWF ,也还有人使用了Maven来构建C编写的项目。

我们已经确定了POM 是描述性和声明性的,它不像 Ant或者Make那样提供显式的指令,我们也注意到POM 的概念不是特定于 Java的。让我们深入更多的细节,看一下Figure 9.1, “项目对象模型” ,纵览一下POM 的内容。

项目对象模型

Figure 9.1. 项目对象模型


POM 包含了四类描述和配置:

项目总体信息

它包含了一个项目的而名称,项目 URL , 发起组织,以及项目的开发者贡献者列表和许可证。

构建设置

在这一部分,我们自定义 Maven构建的默认行为。我们可以更改源码和测试代码的位置,可以添加 新的插件,可以将插件目标绑定到生命周期,我们还可以自定义站点生成参数。

构建环境

构建环境包含了一些能在不同使用环境中 激活的profile。例如,在开发过程中你可能会想要将应用部署到一个而开发服务器上,而在产品环境中你会需要将应用部署到产品服务器上。构建环境为特 定的环境定制了构建设置,通常它还会由~/.m2 中的自定义 settings.xml 补 充。这个settings文件将会在Chapter 11, 构建Profile 中,以及Section A.1, “简介” 中的Appendix A, 附录: Settings细节 小 节中讨论。

POM关系

一个项目很少孤立存在;它会依赖于其它项目,可能从父项目继承POM 设置,它要定义自身的坐标,可能还会包含子模块。

9.2.1. 超 级POM

在深入钻研一些样例POM 之前,让我们先快速看 一下超级POM 。所有的Maven项目的POM 都扩展自超级POM 。 超级POM 定义了一组被所有项目共享的默认设置。它是Maven安装的一部分, 可以在/usr/local/maven/lib 中的maven-2.0.9-uber.jar 文件中找到。如果你看一下这个JAR 文件,你会看到在包org.apache.maven.project 下 看到一个名为pom-4.0.0.xml 的文件。这个Maven的超级POMExample 9.1, “超级POM” 所示。

Example 9.1. 超级POM

<project
>
<modelVersion >4.0.0</modelVersion >
<name >Maven Default Project</name >

<repositories >
<repository >
<id >central</id >
<name >Maven Repository Switchboard</name >
<layout >default</layout >
<url >http://repo1.maven.org/maven2</url >
<snapshots >
<enabled >false</enabled >
</snapshots >
</repository >
</repositories >

<pluginRepositories >
<pluginRepository >
<id >central</id >
<name >Maven Plugin Repository</name >
<url >http://repo1.maven.org/maven2</url >
<layout >default</layout >
<snapshots >
<enabled >false</enabled >
</snapshots >
<releases >
<updatePolicy >never</updatePolicy >
</releases >
</pluginRepository >
</pluginRepositories >

<build >
<directory >target</directory >
<outputDirectory >target/classes</outputDirectory >
<finalName >content-zh-0.6-SNAPSHOT</finalName >
<testOutputDirectory >target/test-classes</testOutputDirectory >
<sourceDirectory >src/main/java</sourceDirectory >
<scriptSourceDirectory >src/main/scripts</scriptSourceDirectory >
<testSourceDirectory >src/test/java</testSourceDirectory >
<resources >
<resource >
<directory >src/main/resources</directory >
</resource >
</resources >
<testResources >
<testResource >
<directory >src/test/resources</directory >
</testResource >
</testResources >
</build >

<pluginManagement >
<plugins >
<plugin >
<artifactId >maven-antrun-plugin</artifactId >
<version >1.1</version >
</plugin >
<plugin >
<artifactId >maven-assembly-plugin</artifactId >
<version >2.2-beta-1</version >
</plugin >
<plugin >
<artifactId >maven-clean-plugin</artifactId >
<version >2.2</version >
</plugin >
<plugin >
<artifactId >maven-compiler-plugin</artifactId >
<version >2.0.2</version >
</plugin >
<plugin >
<artifactId >maven-dependency-plugin</artifactId >
<version >2.0</version >
</plugin >
<plugin >
<artifactId >maven-deploy-plugin</artifactId >
<version >2.3</version >
</plugin >
<plugin >
<artifactId >maven-ear-plugin</artifactId >
<version >2.3.1</version >
</plugin >
<plugin >
<artifactId >maven-ejb-plugin</artifactId >
<version >2.1</version >
</plugin >
<plugin >
<artifactId >maven-install-plugin</artifactId >
<version >2.2</version >
</plugin >
<plugin >
<artifactId >maven-jar-plugin</artifactId >
<version >2.2</version >
</plugin >
<plugin >
<artifactId >maven-javadoc-plugin</artifactId >
<version >2.4</version >
</plugin >
<plugin >
<artifactId >maven-plugin-plugin</artifactId >
<version >2.3</version >
</plugin >
<plugin >
<artifactId >maven-rar-plugin</artifactId >
<version >2.2</version >
</plugin >
<plugin >
<artifactId >maven-release-plugin</artifactId >
<version >2.0-beta-7</version >
</plugin >
<plugin >
<artifactId >maven-resources-plugin</artifactId >
<version >2.2</version >
</plugin >
<plugin >
<artifactId >maven-site-plugin</artifactId >
<version >2.0-beta-6</version >
</plugin >
<plugin >
<artifactId >maven-source-plugin</artifactId >
<version >2.0.4</version >
</plugin >
<plugin >
<artifactId >maven-surefire-plugin</artifactId >
<version >2.4.2</version >
</plugin >
<plugin >
<artifactId >maven-war-plugin</artifactId >
<version >2.1-alpha-1</version >
</plugin >
</plugins >
</pluginManagement >

<reporting >
<outputDirectory >target/site</outputDirectory >
</reporting >
</project >

这个超级POM 定义了一些由所有项目继承的标准 配置变量。对这些变量的简单解释如下:

1

默认的超级POM 定义 了一个单独的远程Maven仓库,ID为central 。这是所有Maven客户端默认配置 访问的中央Maven仓库。该配置可以通过一个自定义的settings.xml 文件来覆 盖。注意这个默认的超级POM 关闭了从中央Maven仓库下载snapshot 构件的功能。如果你需要使用一个snapshot仓库,你就要在你的pom.xml 或者settings.xml 中自定义仓库设置。Settings和profile将会在Chapter 11, 构建Profile 中和Section A.1, “简介” 中的Appendix A, 附录: Settings细节 小 节中具体介绍。

2

中央Maven仓库同时也包含Maven插件。默认的插件仓库就是这个中央仓库。 Snapshot被关闭了,而且更新策略被设置成了“从不”,这意味着Maven将永远不会自动更新一个插件,即使新版本的插件发布了。

3

build 元素设 置Maven标准目录布局中那些目录的默认值。

4

从Maven 2.0.9开始,超级POM 为 核心插件提供了默认版本。这么做是为那些没有在它们POM 中指定插件版本的用户 提供一些稳定性。

超级POM永远是最基础的父POM

Figure 9.2. 超级POM永远是最基础的父POM

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值