POM 代表工程对象模型。它是使用 Maven 工作时的基本组建,是一个 xml 文件。它被放在工程根目录下,文件命名为 pom.xml。
POM 包含了关于工程和各种配置细节的信息,Maven 使用这些信息构建工程。
POM 也包含了目标和插件。当执行一个任务或者目标时,Maven 会查找当前目录下的 POM,从其中读取所需要的配置信息,然后执行目标。能够在 POM 中设置的一些配置如下:
在创建 POM 之前,我们首先确定工程组(groupId),及其名称(artifactId)和版本,在仓库中这些属性是工程的唯一标识。
<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 文件。
节点 | 描述 |
---|---|
groupId | 这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.company.bank 拥有所有的和银行相关的项目。 |
artifactId | 这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。 |
version |
这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如: com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1. |
所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。父 POM 也被称作 Super POM,它包含了一些可以被继承的默认设置。
Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关的目标,它帮助开发者在 pom.xml 中做尽可能少的配置,当然这些配置可以被方便的重写。
查看 Super POM 默认配置的一个简单方法是执行以下命令:mvn help:effective-pom
在你的电脑上的任意目录下创建一个 pom.xml 文件,使用上面提到的示例 pom 中的内容。
在下面的例子中,我们在 C:\MVN\project
目录中创建了一个 pom.xml 文件。
现在打开命令控制台,到 pom.xml 所在的目录下执行以下 mvn 命令。
C:\MVN\project>mvn help: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] ------------------------------------------------------------------------ |
<?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> |
Maven 的 pom.xml 文件也不需要手工编写。
Maven 提供了大量的原型插件来创建工程,包括工程结构和 pom.xml。