POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,它是一个 XML 文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖等等。执行任务或目标时,Maven 会在当前目录中查找并读取 POM,获取所需的配置信息,然后执行目标。

1、基本配置

<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.mycompany</groupId>    <artifactId>myproject</artifactId>    <version>1.0.0</version>    <description>项目描述</description>    <name>项目名称</name>    <url>https://www.mycompany.com/myproject</url>    <packaging>jar</packaging>    <inceptionYear>2023</inceptionYear></project>

配置说明:

节点说明
project工程的根标签
modelVersion模型版本,设置为:4.0.0;必需
groupId工程组标识,它在一个组织或者项目中通常是唯一的;必需
artifactId工程标识,它通常是工程的名称;必需
version工程版本号;必需
description工程描述
name工程名称
url工程主页
packaging打包类型,常见类型为:pom、jar、war、ear;默认为:jar
inceptionYear项目创建年份,4 位数字;版权信息生成时需使用这个配置

2、parent

所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM),父 POM 包含了一些可以被继承的默认设置。

<parent>    <groupId>com.mycompany</groupId>    <artifactId>parent-project</artifactId>    <version>1.0</version>    <relativePath/></parent>

配置说明:

节点说明
groupId父工程组标识;必需
artifactId父工程标识;必需
version父工程版本号;必需
relativePath父工程 pom.xml 文件的相对路径;默认值为:../pom.xml。Maven 首先在当前工程的目录寻找父工程的 pom,其次在 relativePath,然后在本地仓库,最后在远程仓库寻找父项目的 pom

3、prerequisites

prerequisites 元素用于描述构建该项目的先决条件。

<prerequisites>    <maven>3.8.0</maven></prerequisites>

配置说明:

节点说明
maven构建项目或使用该插件所需要的 Maven 最低版本

4、issueManagement

issueManagement 元素用于描述项目的问题管理系统。

<issueManagement>    <system>jira</system>    <url>http://10.39.196.10:8080/banseon</url></issueManagement>

配置说明:

节点说明
system问题系统名称
url问题系统 URL

5、ciManagement

ciManagement 元素用于描述项目的持续集成系统。

<ciManagement>    <system></system>    <url></url>    <notifiers>        <notifier>            <type></type>            <sendOnError>true</sendOnError>            <sendOnFailure>true</sendOnFailure>            <sendOnSuccess>true</sendOnSuccess>            <sendOnWarning>true</sendOnWarning>            <address></address>            <configuration/>        </notifier>    </notifiers></ciManagement>

配置说明:

节点说明
system集成系统名称
url集成系统 URL
notifiers构建完成时,需通知的人员列表,包括被通知者信息和通知条件
notifiers/notifier一个被通知人员配置信息
notifiers/notifier/type使用何种方法通知
notifiers/notifier/sendOnError发生错误时是否通知
notifiers/notifier/sendOnFailure构建失败时是否通知
notifiers/notifier/sendOnSuccess构建成功时是否通知
notifiers/notifier/sendOnWarning发生警告时是否通知
notifiers/notifier/address通知发送到哪里,该配置已过期
notifiers/notifier/configuration扩展配置项

6、mailingLists

mailingLists 元素用于描述项目相关的邮件信息。

<mailingLists>    <mailingList>        <name>jack</name>        <post>123456@qq.com</post>        <subscribe>123456@qq.com</subscribe>        <unsubscribe>123456@qq.com</unsubscribe>        <archive></archive>    </mailingList></mailingLists>

配置说明:

节点说明
mailingList一个邮件信息
mailingList/name邮件名称
mailingList/post用于接受外部信息的邮件地址或链接;如果是邮件地址,那么在创建文档时将自动创建一个 mailto 链接。
mailingList/subscribe用于订阅的邮件地址或链接;如果是邮件地址,那么在创建文档时将自动创建一个 mailto 链接。
mailingList/unsubscribe用于取消订阅的邮件地址或链接;如果是邮件地址,那么在创建文档时将自动创建一个 mailto 链接。
mailingList/archive可以浏览邮件信息的 URL

7、licenses

licenses 元素用于列出该项目的 license 列表。

<licenses>    <license>        <name>The Apache Software License, Version 2.0</name>        <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>        <distribution>repo</distribution>        <comments></comments>    </license></licenses>

配置说明:

节点说明
license表示一个 license
namelicense 的名称
urllicense 页面 URL
distribution项目的分发方式:repo,可以从 Maven 仓库下载;manual 用户须手动下载和安装依赖
commentslicense 的补充信息

8、developers

developers 用于列出项目开发者。

<developers>    <developer>        <id>123</id>        <name>abc</name>        <email>123456789@qq.com</email>        <url>https://www.abc.com</url>        <roles>            <role>Project Manager</role>        </roles>        <organization>xyz</organization>        <organizationUrl>https://www.xyz.com</organizationUrl>        <properties>            <dept>aa</dept>        </properties>        <timezone>8</timezone>    </developer></developers>

配置说明:

节点说明
developer表示一个开发者
id项目开发者的 id
name项目开发者的姓名
email项目开发者的 email
url项目开发者的个人主页
roles、role项目开发者在项目中扮演的角色
organization项目开发者所属组织
organizationUrl项目开发者所属组织的 URL
properties项目开发者属性
timezone项目开发者所在时区,-11 到 12 范围内的整数

9、contributors

contributors 元素描述尚未成为提交者的项目贡献者。

<contributors>    <contributor>        <name>abc</name>        <email>123456789@qq.com</email>        <url>https://www.abc.com</url>        <roles>            <role>Project Tester</role>        </roles>        <organization>xyz</organization>        <organizationUrl>https://www.xyz.com</organizationUrl>        <properties>            <dept>aa</dept>        </properties>        <timezone>8</timezone>    </contributor></contributors>

配置说明:

节点说明
contributor表示一个贡献者
name贡献者的姓名
email贡献者的 email
url贡献者的个人主页
roles、role贡献者在项目中扮演的角色
organization贡献者所属组织
organizationUrl贡献者所属组织的 URL
properties贡献者属性
timezone贡献者所在时区,-11 到 12 范围内的整数

10、scm

SCM(Source Control Management)元素用于配置项目的代码库。

<scm>    <url>https://github.com/abc/abc-common</url>    <connection>https://github.com/abc/abc-common.git</connection>    <developerConnection>https://github.com/abc/abc-common-dev.git</developerConnection>    <tag></tag></scm>

配置说明:

节点说明
url可浏览代码库的 URL
connection可以连接到代码库的 URL,该连接只读
developerConnection开发者连接到代码库的 URL,该连接可写
tag当前代码的标签,在开发阶段默认为 HEAD

11、organization

organization 元素用于描述项目所属组织。

节点说明
name组织的全名
url组织的主页 URL

12、properties

properties 用于定义键值对。

<properties>    <maven.compiler.source>8</maven.compiler.source>    <maven.compiler.target>8</maven.compiler.target>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <spring.version>5.2.24.RELEASE</spring.version></properties>

13、dependencies

dependencies 用于定义项目的依赖。

<dependencies>    <dependency>        <groupId>com.abc</groupId>        <artifactId>commons</artifactId>        <version>1.0.0</version>        <type>jar</type>        <classifier></classifier>        <scope>compile</scope>        <!--systemPath></systemPath-->        <exclusions>            <exclusion>                <groupId>com.xyz</groupId>                <artifactId>xxx</artifactId>            </exclusion>        </exclusions>    </dependency>    <optional>true</optional></dependencies>

配置说明:

节点说明
dependency表示一个依赖
groupId依赖工程组标识
artifactId依赖工程标识
version依赖工程版本
type依赖类型,默认为 jar;它通常表示依赖文件的扩展名
classifier依赖的分类器,它可以区分属于同一个 POM,但不同构建方式生成的构件。分类器名被附加到文件名的版本号后面。
scope依赖范围,可以为:compile、test、runtime、provided、system;默认为:compile
systemPath仅供 system 范围使用。该元素为依赖指定了文件系统上的路径,需要绝对路径而不是相对路径。
exclusions排除该依赖工程不需要的依赖
exclusion表示一个排除的依赖。groupId:排除的依赖工程组标识;artifactId:排除的依赖工程标识,可以用 * 表示任意个字符
optional可选依赖,它阻断依赖的传递性。对于该依赖的依赖将不会被引入。

14、dependencyManagement

dependencyManagement 元素用于对依赖进行管理;这部分的依赖信息不会被立即解析,而是当在 dependencies 中声明一个依赖(groupId 和 artifactId 必须),如果 groupId 和 artifactId 以外的一些信息没有描述,则通过 groupId 和 artifactId 匹配到这里的依赖,并使用这里的依赖信息。

<dependencyManagement>    <dependencies>        <dependency>            ...        </dependency>    </dependencies></dependencyManagement>

15、modules

<modules>    <module>module-a</module>    <module>module-b</module>    <module>module-c</module></modules>

modules 元素用于列出项目的模块(子项目)。

配置说明:

节点说明
module一个模块,元素值为指向该模块的相对路径

16、reporting

reporting 元素用于生成报表,当执行”mvn site”,报表就会按照配置生成。

<reporting>    <excludeDefaults>false</excludeDefaults>    <outputDirectory>${project.build.directory}/site</outputDirectory>    <plugins>        <plugin>            <groupId>com.abc</groupId>            <artifactId>xyz</artifactId>            <version>1.0.0</version>            <inherited>true</inherited>            <configuration></configuration>            <reportSets>                <reportSet>                    <id>123</id>                    <configuration/>                    <inherited>true</inherited>                    <reports>                        <report></report>                    </reports>                </reportSet>            </reportSets>        </plugin>    </plugins></reporting>

配置说明:

节点说明
excludeDefaults是否排除默认报表,默认:false
outputDirectory报表生成目录,默认:${project.build.directory}/site
plugins报表插件列表
plugins/plugin一个报表插件
plugins/plugin/groupId插件groupId
plugins/plugin/artifactId插件artifactId
plugins/plugin/version插件版本
plugins/plugin/inherited配置是否传播到子 POM
plugins/plugin/configuration插件配置
plugins/plugin/reportSets报表规范列表,每个规范(可能)具有不同的配置,一个规范(报表集)对应一个执行目标
plugins/plugin/reportSets/reportSet一个报表规范
plugins/plugin/reportSets/reportSet/id报表规范唯一标识符
plugins/plugin/reportSets/reportSet/configuration报表规范配置
plugins/plugin/reportSets/reportSet/inherited配置是否传播到子 POM
plugins/plugin/reportSets/reportSet/reports该规范使用到的报表列表
plugins/plugin/reportSets/reportSet/reports/report一个报表

17、build

build 元素用于描述项目如何构建。

<build>    <sourceDirectory>src/main/java</sourceDirectory>    <scriptSourceDirectory></scriptSourceDirectory>    <testSourceDirectory>src/test/java</testSourceDirectory>    <outputDirectory>target/classes</outputDirectory>    <testOutputDirectory>target/test-classes</testOutputDirectory>    <directory>target</directory>    <finalName>${project.artifactId}-${project.version}</finalName>    <defaultGoal>clean package</defaultGoal>    <resources>        <resource>            <directory>src/main/resources</directory>            <includes>                <include>*.xml</include>            </includes>            <excludes>                <exclude>*.abc</exclude>            </excludes>            <targetPath></targetPath>            <filtering>false</filtering>        </resource>    </resources>    <testResources>        <testResource>            <directory>src/test/resources</directory>            <includes>                <include>*.xml</include>            </includes>            <excludes>                <exclude>*.abc</exclude>            </excludes>            <targetPath></targetPath>            <filtering>false</filtering>        </testResource>    </testResources>    <filters>        <filter></filter>    </filters>    <extensions>        <extension>            <groupId>com.abc</groupId>            <artifactId>my-extension</artifactId>            <version>1.0.0</version>        </extension>    </extensions>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-source-plugin</artifactId>            <version>2.2.1</version>            <extensions>false</extensions>            <executions>                <execution>                    <id>attach-source</id>                    <phase></phase>                    <goals>                        <goal>jar-no-fork</goal>                    </goals>                    <inherited>true</inherited>                    <configuration></configuration>                </execution>            </executions>            <dependencies>                <dependency>                </dependency>            </dependencies>            <inherited>true</inherited>            <configuration></configuration>        </plugin>    </plugins>    <pluginManagement>        <plugins>        </plugins>    </pluginManagement></build>

配置说明:

节点说明
sourceDirectory源码目录,该路径是相对于 pom.xml 的相对路径。
scriptSourceDirectory脚本源码目录,该目录下的内容会被拷贝到输出目录;该路径是相对于 pom.xml 的相对路径。
testSourceDirectory测试源码目录,该路径是相对于 pom.xml 的相对路径。
outputDirectory编译输出目录,该路径是相对于 pom.xml 的相对路径。
testOutputDirectory测试代码编译输出目录,该路径是相对于 pom.xml 的相对路径。
directory构建产生的所有文件存放目录,该路径是相对于 pom.xml 的相对路径。
finalName生成构件的文件名,默认值是 ${artifactId}-${version}
defaultGoal默认的目标,配置该选项,可以运行简化的命令:mvn 来构建项目。
resources资源信息,如:项目相关的配置文件
resources/resource一个资源信息配置
resources/resource/directory资源目录
resources/resource/directory/includes包含的文件列表
resources/resource/directory/includes/include一个包含文件的配置,如:**/*.xml
resources/resource/directory/excludes排除的文件列表
resources/resource/directory/excludes/exclude一个排除文件的配置,如:**/*.abc
resources/resource/targetPath资源的目标目录,该路径是相对于${project.build.outputDirectory} 的相对路径
resources/resource/filtering是否使用参数值代替参数名,参数值取自 properties 元素或者 filters 元素配置的文件里的属性;默认:false
testResources资源信息,如:测试相关的配置文件
testResources/testResource一个测试资源信息配置
testResources/testResource/directory测试资源目录
testResources/testResource/directory/includes包含的文件列表
testResources/testResource/directory/includes/include一个包含文件的配置,如:**/*.xml
testResources/testResource/directory/excludes排除的文件列表
testResources/testResource/directory/excludes/exclude一个排除文件的配置,如:**/*.abc
testResources/testResource/targetPath资源的目标目录,该路径是相对于${project.build.testOutputDirectory} 的相对路径
testResources/testResource/filtering是否使用参数值代替参数名,参数值取自 properties 元素或者 filters 元素配置的文件里的属性;默认:false
filters当 filtering 为 true 时,使用到的属性文件列表
filters/filter一个属性文件
extensions项目使用到的构建扩展
extensions/extension一个构建扩展
extensions/extension/groupId构建扩展groupId
extensions/extension/artifactId构建扩展artifactId
extensions/extension/version构建扩展版本
plugins插件列表
plugins/plugin一个插件
plugins/plugin/groupId插件groupId
plugins/plugin/artifactId插件artifactId
plugins/plugin/version插件版本
plugins/plugin/extensions是否从该插件加载 Maven 扩展(比如打包和类型处理程序),出于性能考虑,应该只在必要时启用该功能。默认:false
plugins/plugin/executions执行的目标列表
plugins/plugin/executions/execution一个执行目标
plugins/plugin/executions/execution/id执行目标的标识符
plugins/plugin/executions/execution/phase绑定目标到构建生命周期阶段,如果省略,目标会被绑定到插件配置的默认阶段
plugins/plugin/executions/execution/goals执行的目标列表
plugins/plugin/executions/execution/goals/goal一个执行目标
plugins/plugin/dependencies插件所需要的额外依赖,参考dependencies 元素
plugins/plugin/executions/execution/inherited配置是否传播到子 POM
plugins/plugin/executions/execution/configuration插件的配置信息
pluginManagement插件管理,这里的插件配置项直到被引用时才会被解析或绑定到生命周期。pluginManagement 和plugins 的关系类似dependencyManagement 和dependencies 的关系。
pluginManagement/plugins插件列表,参考plugins 元素

18、repositories

repositories 用于配置依赖和扩展的远程仓库。

<repositories>    <repository>        <id>snapshot-repository</id>        <name>snapshots</name>        <url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>        <layout>default</layout>        <releases>            <enabled>false</enabled>            <updatePolicy>daily</updatePolicy>            <checksumPolicy>warn</checksumPolicy>        </releases>        <snapshots>            <enabled>true</enabled>            <updatePolicy>always</updatePolicy>            <checksumPolicy>warn</checksumPolicy>        </snapshots>    </repository></repositories>

配置说明:

节点说明
repository一个远程参考配置
repository/id远程仓库唯一标识符,可以用来匹配在 settings.xml 文件里配置的远程仓库
repository/name远程仓库名称
repository/url远程仓库 URL
repository/layout仓库布局类型,可以为:legacy(遗留)、default
repository/releases如何处理远程仓库里发布版本的下载
repository/releases/enabled是否从该仓库下载发布版本,默认:true
repository/releases/updatePolicy下载更新的频率,可以为:always,daily(默认,每日),interval:X(单位为分钟),never
repository/releases/checksumPolicy当 Maven 验证构件校验文件失败时如何处理:ignore,fail,warn
repository/snapshots如何处理远程仓库里快照版本的下载
repository/snapshots/enabled是否从该仓库下载快照版本,默认:true
repository/snapshots/updatePolicy下载更新的频率,可以为:always,daily(默认,每日),interval:X(单位为分钟),never
repository/snapshots/checksumPolicy当 Maven 验证构件校验文件失败时如何处理:ignore,fail,warn

19、pluginRepositories

pluginRepositories 用于配置插件的远程仓库。

<pluginRepositories>    <pluginRepository>    ...    </pluginRepository></pluginRepositories>

pluginRepositories/pluginRepository 表示一个远程仓库配置,它的子元素与 repositories/repository 一致。

20、distributionManagement

distributionManagement 用于描述项目如何分发,执行 mvn deploy后将把项目分发到对应的位置;通过该配置可以把网站部署到远程服务器或者把构件部署到远程仓库。

<distributionManagement>    <repository>        <id>ossrh</id>        <name>ossrh</name>        <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>        <uniqueVersion>false</uniqueVersion>        <layout>default</layout>    </repository>    <snapshotRepository>        <id>ossrh</id>        <name>ossrh</name>        <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>        <uniqueVersion>false</uniqueVersion>        <layout>default</layout>    </snapshotRepository>    <site>        <id></id>        <name></name>        <url></url>    </site>    <downloadUrl></downloadUrl>    <relocation>        <groupId></groupId>        <artifactId></artifactId>        <version></version>        <message></message>    </relocation>    <status></status></distributionManagement>

配置说明:

节点说明
repository项目发布版本部署的远程仓库
repository/id远程仓库唯一标识,可以用来匹配在 settings.xml 文件里配置的远程仓库
repository/name远程仓库名称
repository/url远程仓库 URL
repository/layout仓库布局类型,可以为:legacy(遗留)、default
snapshotRepository项目快照版本部署的远程仓库
snapshotRepository/id远程仓库唯一标识,可以用来匹配在 settings.xml 文件里配置的远程仓库
snapshotRepository/name远程仓库名称
snapshotRepository/url远程仓库 URL
snapshotRepository/layout仓库布局类型,可以为:legacy(遗留)、default
site项目部署的站点
site/id站点唯一标识,可以用来匹配在 settings.xml 文件里配置的站点
site/name站点名称
site/url站点 URL
downloadUrl项目下载页面的 URL,如果没有该元素,用户应该参考主页。使用该元素的原因是:帮助定位那些不在仓库里的构件(由于license限制)
relocation如果项目有了新的 groupId 和 artifactId(项目移到了新的位置),这里列出项目新的信息
relocation/groupId项目新 groupId
relocation/artifactId项目新artifactId
relocation/version项目新版本
relocation/message向用户显示有关项目移动的附加消息,例如原因
status给出该工件在远程存储库中的状态。不能在本地项目中设置,它是由远程仓库的工具更新的。有效值为:none(默认值)、converted(仓库管理器从Maven 1 POM转换)、partner(直接从Maven 2仓库同步)、deployed(从Maven 2实例部署)、verified(已手工验证为正确的和最终的)。

21、profiles

profiles 元素用于描述项目构建配置,如果被激活,将会修改构建处理。

<profiles>    <profile>        <id>abc</id>        <activation>            <activeByDefault>false</activeByDefault>            <jdk>[1.8,)</jdk>            <os>                <name>Win10</name>                <family>Windows</family>                <arch>x86</arch>                <version>22H2</version>            </os>            <property>                <name>mavenVersion</name>                <value>3.8.1</value>            </property>            <file>                <exists>/home/mongo/a.txt</exists>                <missing>/home/mongo/b.txt</missing>            </file>        </activation>        <build>        </build>        <modules>        </modules>        <repositories>        </repositories>        <pluginRepositories>        </pluginRepositories>        <dependencies>        </dependencies>        <dependencyManagement>        </dependencyManagement>        <distributionManagement>        </distributionManagement>        <properties/>        <reports/>        <reporting>                    </reporting>    </profile></profiles>

配置说明:

节点说明
profile一个构建配置
profile/id构建配置唯一标识,用于命令行激活,也用于在继承时合并具有相同标识符的 profile
profile/activation触发此构建配置的条件逻辑。
profile/activation/activeByDefault默认是否激活
profile/activation/jdk当检测到匹配的 JDK 时将激活此构建配置
profile/activation/os当检测到匹配的操作系统时将激活此构建配置
profile/activation/os/name用于激活构建配置的操作系统名称,必须与 Java 属性 ${os.name} 精确匹配
profile/activation/os/family用于激活构建配置的通用操作系统系列
profile/activation/os/arch用于激活构建配置的操作系统体系结构
profile/activation/os/version用于激活构建配置的操作系统版本
profile/activation/property用于激活构建配置的 Maven 系统属性,如果存在对应属性和值将会激活该构建配置
profile/activation/property/name属性名称
profile/activation/property/value属性值,如果为空,那将不判断属性的值,只要属性存在就会激活该构建配置
profile/activation/file通过文件是否存在来激活构建配置
profile/activation/file/exists如果该文件存在,则激活构建配置
profile/activation/file/missing如果该文件不存在,则激活构建配置
profile/build项目构建所需信息,参考 build 元素
profile/modules项目模块信息,参考 modules 元素
profile/repositories依赖和扩展的远程仓库,参考repositories 元素
profile/pluginRepositories插件的远程仓库,参考 pluginRepositories 元素
profile/dependencies项目的依赖信息,参考 dependencies 元素
profile/dependencyManagement通过该配置来管理依赖,参考dependencyManagement元素
profile/distributionManagement项目分发信息,参考 distributionManagement 元素
profile/properties项目属性信息,参考properties元素
profile/reports已过期
profile/reporting根据该配置生成报表,参考 reporting 元素

参考:https://www.runoob.com/maven/maven-pom.html。