Maven - POM
POM意为项目对象模型(Project Object Model),是Maven中基本单元。它是一个名为pom.xml的XML文件,总是存在于项目的根目录下。
POM包含了项目相关的信息和Maven用来构建一个或多个项目的各种配置详情。
POM也包含了各种目标操作(goal)和插件。当执行一个任务或者目标操作时,Maven会查找当前目录下的POM。Maven读取POM,从中获得需要的配置信息,然后执行目标操作。部分Maven可以从POM中明确的配置列出如下:
- 项目依赖(project dependencies)
- 插件(plugins)
- 目标操作(goals)
- 构建(build profiles)
- 项目版本(project version)
- 开发者(developers)
- 邮件列表(mailing list)
在创建一个POM之前,我们首先应该决定项目组织(groupId),项目命名(artifactId)和项目版本,因为这些属性信息可以帮助我们在项目仓库中唯一确定一个项目。
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>
<groupId>com.companyname.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
</project>
要注意的是每个项目需要有唯一的POM文件。
- 所有的POM文件要求有projec节点和三个必须字段:groupId, artifactId,version。
- 在仓库中项目的标识为groupId:artifactId:version。
- POM.xml的根节点是project并且其下有三个主要的子节点:
节点 | 描述 |
---|---|
groupId | 项目组织的Id。通常在一个项目或者一个组织之中,这个Id是唯一的。例如,某个Id为com.company.bank的银行组织包含所有银行相关的项目。 |
artifactId | 项目的Id,通常是项目的名字。例如,consumer-banking。artifactId与groupId一起定义了仓库中项目构件的路径。 |
version | 项目的版本。它与groupId一起,在项目构件仓库中用作区分不同的版本,例如: com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1. |
Super POM
所有的POM都继承一个父类POM(不管是显示定义继承的还是没有显示定义的)。这个基础的POM被称为超类POM(Super POM) ,它包含了POM默认继承的属性值。
Maven使用有效的POM(effective pom,其配置来源于超类POM加上项目配置)来执行相关的目标操作。这能帮助开发者在他/她的pom.xml中识别出最小量的配置详情,虽说起来配置覆盖也非常地容易。
一个简单的查看超类POM的默认配置的方法是裕兴如下的命令:mvn help:effective-pom
在你的电脑任意目录下创建一个pom.xml文件,内容使用上面提到的pom示例中的。
在展示下面的例子前,我们已经在C:\MVN\project文件夹中创建了一个pom.xml文件。
现在打开命令控制台,去到包含pom.xml的文件夹,然后执行下面的mvn命令。
C:\MVN\project>mvn help:effective-pom
Maven将开始处理并显示有效的pom(effective-pom).
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'help'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.project-group:project-name:jar:1.0
[INFO] task-segment: [help:effective-pom] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [help:effective-pom {execution: default-cli}]
[INFO]
.....
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Thu Jul 05 11:41:51 IST 2012
[INFO] Final Memory: 6M/15M
[INFO] ------------------------------------------------------------------------
Effective POM在继承(inheritance)、插值(interpolation)和使用配置(profile applying)后,展示的就如控制台中的结果一样。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ================================================================= -->
<!-- -->
<!-- Generated by Maven Help Plugin on 2012-07-05T11:41:51 -->
<!-- See: http://maven.apache.org/plugins/maven-help-plugin/ -->
<!-- -->
<!-- ================================================================= -->
<!-- ================================================================= -->
<!-- -->
<!-- Effective POM for project -->
<!-- 'com.companyname.project-group:project-name:jar:1.0' -->
<!-- -->
<!-- ================================================================= -->
<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 h
ttp://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<sourceDirectory>C:\MVN\project\src\main\java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>C:\MVN\project\src\test\java</testSourceDirectory>
<outputDirectory>C:\MVN\project\target\classes</outputDirectory>
<testOutputDirectory>C:\MVN\project\target\test-classes</testOutputDirectory>
<resources>
<resource>
<mergeId>resource-0</mergeId>
<directory>C:\MVN\project\src\main\resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<mergeId>resource-1</mergeId>
<directory>C:\MVN\project\src\test\resources</directory>
</testResource>
</testResources>
<directory>C:\MVN\project\target</directory>
<finalName>project-1.0</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</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.4</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.5</version>
</plugin>
<plugin>
<artifactId>maven-plugin-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<plugin>
<artifactId>maven-rar-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.0-beta-8</version>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.3</version>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>2.0-beta-7</version>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.0.4</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.3</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1-alpha-2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-help-plugin</artifactId>
<version>2.1.1</version>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
</pluginRepository>
</pluginRepositories>
<reporting>
<outputDirectory>C:\MVN\project\target/site</outputDirectory>
</reporting>
</project>
在上面的pom.xml中,你可以看到项目默认的源文件目录结构,输出路径,需要的插件,报告目录,这些信息Maven在执行期望的目标操作时都会用到。
Maven的pom.xml也不要求手动写。
Maven提供了超多种archetype插件用来创建项目以及按规则创建项目结构和pom.xml文件。
更多详情在Maven - 插件 和 Maven - 创建项目 章节有提及。