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是相似的,它们都依赖于一个统一命名的文件如Makefile,build.xml,或者pom.xml,但相似的地方也仅此而已。如果你看一下Maven的pom.xml,POM的主要内容是处理描述信息:哪里存放源代码?哪里存放资源文件?打包方式是什么?如果你看一下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代码构建成SWC和SWF,也还有人使用了Maven来构建C编写的项目。
我们已经确定了POM是描述性和声明性的,它不像Ant或者Make那样提供显式的指令,我们也注意到POM的概念不是特定于Java的。让我们深入更多的细节,看一下Figure 9.1, “项目对象模型”,纵览一下POM的内容。
POM包含了四类描述和配置:
- 项目总体信息
- 构建设置
-
在这一部分,我们自定义Maven构建的默认行为。我们可以更改源码和测试代码的位置,可以添加新的插件,可以将插件目标绑定到生命周期,我们还可以自定义站点生成参数。
- 构建环境
-
构建环境包含了一些能在不同使用环境中 激活的profile。例如,在开发过程中你可能会想要将应用部署到一个而开发服务器上,而在产品环境中你会需要将应用部署到产品服务器上。构建环境为特定的环境定制了构建设置,通常它还会由
~/.m2中的自定义settings.xml补充。这个settings文件将会在Chapter 11, 构建Profile中,以及Section A.1, “简介”中的Appendix A, 附录: Settings细节小节中讨论。 - POM关系
-
一个项目很少孤立存在;它会依赖于其它项目,可能从父项目继承POM设置,它要定义自身的坐标,可能还会包含子模块。
在深入钻研一些样例POM之前,让我们先快速看一下超级POM。所有的Maven项目的POM都扩展自超级POM。超级POM定义了一组被所有项目共享的默认设置。它是Maven安装的一部分,可以在${M2_HOME}/lib中的maven-2.0.9-uber.jar文件中找到。如果你看一下这个JAR文件,你会看到在包org.apache.maven.project下看到一个名为pom-4.0.0.xml的文件。这个Maven的超级POM如Example 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.5</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定义了一些由所有项目继承的标准配置变量。对这些变量的简单解释如下:
|
默认的超级POM定义了一个单独的远程Maven仓库,ID为 |
|
中央Maven仓库同时也包含Maven插件。默认的插件仓库就是这个中央仓库。Snapshot被关闭了,而且更新策略被设置成了“从不”,这意味着Maven将永远不会自动更新一个插件,即使新版本的插件发布了。 |
|
|
|
从Maven 2.0.9开始,超级POM为核心插件提供了默认版本。这么做是为那些没有在它们POM中指定插件版本的用户提供一些稳定性。 |







