Maven 详细配置:Maven 项目 POM 文件解读
Maven 是 Java 开发领域中广泛使用的项目管理和构建工具,通过其核心配置文件——POM(Project Object Model)文件,开发者能够定义项目的基本信息、依赖关系、插件配置以及构建生命周期等关键要素。POM 文件不仅是 Maven 项目的核心,更是项目依赖和模块化管理的基础。在使用 Maven 管理复杂项目时,深入理解 POM 文件的结构和作用至关重要。本篇内容将系统解读 POM 文件的核心要素,帮助读者全面掌握其配置方法及最佳实践,为高效管理项目和构建流程奠定坚实基础。
文章目录
- 1、POM_的概念
- 2、基础设置
- 2.1、Maven_坐标
- 2.2、打包方式
- 2.3、POM_关系
- 2.4、依赖项
- 2.5、依赖管理
- 2.6、属性
- 3、构建设置
- 3.1、构建元素
- 3.2、报告元素
- 4、更多项目信息
- 4.1、简单信息元素
- 4.2、许可证
- 4.3、组织
- 4.4、开发人员
- 4.5、贡献者
- 5、环境设置
- 5.1、问题管理
- 5.2、持续集成管理
- 5.3、邮件列表
- 5.4、供应链管理
- 5.5、先决条件
- 5.6、存储库
- 5.7、插件库
- 5.8、分发管理
- 5.9、配置管理
1、POM_的概念
在 Maven 官网,关于 POM 文件的说明页面(https://maven.apache.org/pom.html)说明了:
POM 代表 “项目对象模型(Project Object Model)”,它是 Maven 项目的 XML 表示形式,存放在名为 pom.xml
的文件中。当和 Maven 相关人员交谈时,提到项目并不仅仅是指一个代码文件的集合,而是在哲学意义上超越了这个概念。一个项目不仅包含配置文件,还包括参与开发的人员及其角色、缺陷跟踪系统、组织和许可证、项目所在的网址、项目的依赖项以及所有其他能够赋予代码生命的细小环节。它是关于项目的“一站式商店”。实际上,在 Maven 的世界中,一个项目甚至不需要包含任何代码,只需有一个 pom.xml
文件即可
下面是一份位于 POM 文件中 <project>
元素下的元素列表(截图自官网):
Maven 官方在官网中将 POM 的顶级元素分为了四大类,分别是: The Basics(基础设置)、Build Settings(构建设置)、More Project Information(更多项目信息)以及 Environment Settings(环境设置)。
2、基础设置
2.1、Maven_坐标
在 Maven 中,坐标(Coordinates) 是用来唯一标识一个构件的方式。每个构件都有一个唯一的坐标。Maven 还使用坐标来确保在构建过程中正确解析和获取依赖的版本。
通过下面三个元素的定义会指向固定项目的特定版本。让 Maven 知道我们正在与谁打交道,以确保依赖的准确性和一致性。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- **项目组唯一标识符,通常是组织的反向域名 -->
<groupId>com.lizhengi</groupId>
<!-- 项目构建产物的标识符,通常为项目名称 -->
<artifactId>lizhengi-demo-maven</artifactId>
<!-- 项目当前版本 格式一般为为:`主版本.次版本.增量版本-限定版本号 -->
<version>0.0.1-SNAPSHOT</version>
...
</project>
配置详细说明:
- 顶级元素
groupId
:项目组唯一标识符,通常是组织的反向域名。 - 顶级元素
artifactId
:项目构建产物的标识符,通常为项目名称,它和groupId
一起标识一个构件,组成为构建的全球唯一标识符。 - 顶级元素
version
:项目当前版本,格式一般为为:主版本.次版本.增量版本-限定版本号
(1.0.0-SNAPSHOT
)。
2.2、打包方式
Maven 提供了多种打包方式,以支持不同类型的项目和需求。每种打包方式都可以通过在 pom.xml
中设置 <packaging>
标签来指定。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目打包类型,默认值为 jar -->
<packaging>pom</packaging>
...
</project>
配置详细说明:
- 顶级元素
packaging
:项目打包类型,默认值为jar
。
2.3、POM_关系
Maven 的一个强大的方面是它处理项目关系:这包括依赖关系(和传递依赖关系)、继承和聚合(多模块项目)。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 父项目信息,用于依赖传递,如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值 -->
<parent>
<!-- 父项目坐标 -->
<!-- 标签 groupId 和 version 可以被继承或覆盖,继承情况下子项目标签定义可以省略 -->
<groupId>com.lizhengi</groupId>
<artifactId>lizhengi-demo-framework</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 搜索父项目的给定目录,它不是必需的,但指定后 Maven 会首先搜索该项目父级的给定路径,然后再搜索本地和远程存储库 -->
<relativePath>../../lizhengi-demo-framework</relativePath>
</parent>
<!-- 项目所包含的所有子模块 -->
<modules>
<module>lizhengi-demo-maven-project</module>
</modules>
...
</project>
配置详细说明:
- 顶级元素 **
parent
:**用于依赖传递,标记父项目的 Maven 坐标。如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值。 - 一级子元素
groupId
、artifactId
、version
:父项目的 Maven 坐标。 - 一级子元素
relativePath
:搜索父项目的给定目录,它不是必需的,但指定后 Maven 会首先搜索该项目父级的给定路径,然后再搜索本地和远程存储库。 - 顶级元素 **
modules
:**用于在多模块项目继承和聚合,列出该了项目所包含的所有子模块。 - 一级子元素
module
:顶级元素modules
子标签,标签内列出子模块的名称。
2.4、依赖项
POM 的基础是其依赖项列表。大多数项目都依赖于其他项目才能正确构建和运行。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的所有依赖项 -->
<dependencies>
<!-- 项目依赖项 -->
<dependency>
<!-- 依赖项坐标 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.3.5</version>
<!-- 依赖项的分类器,在依赖中指定 classifier(同一个 artifactId 构件可以有不同的 classifier) -->
<classifier>jdk8</classifier>
<!-- 依赖项的打包类型(同一个 artifactId 构件可以有不同的打包类型) -->
<type>jar</type>
<!-- 依赖的范围,控制依赖在不同构建阶段的使用,可选的值有 [provided, compile, runtime, test, system] -->
<scope>compile</scope>
<!-- 仅当依赖项为 system 时才使用,用于指定本地系统中 jar 文件的路径 -->
<systemPath/>
<!-- 排除的依赖构件集,即告诉 Maven 只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题 -->
<exclusions>
<!-- 排除的具体依赖构件集 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
<!-- 可选依赖,阻断依赖的传递性,默认为 false -->
<optional>true</optional>
</dependency>
</dependencies>
...
</project>
配置详细说明:
- 顶级元素 **
dependencies
:**描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。 - 一级子元素 **
dependency
:**表示一个单独的依赖项,包含了该依赖的所有详细信息。 - 二级子元素
groupId
、artifactId
、version
:依赖项坐标。 - 二级子元素 **
classifier
:**分类器,用于区分同一artifact
的不同变种。例如一个项目,同时提供了针对 Java11 和 Java1.8 的两个编译版本,则可以通过classifier
进行区分。 - 二级子元素 **
type
:**指定依赖的打包类型,默认是jar
。 - 二级子元素
scope
:依赖的范围,控制依赖在不同构建阶段的使用。 - 二级子元素 **
systemPath
:**仅用于system
范围,指定依赖库的本地路径。一般不推荐使用,因为它依赖于文件系统的绝对路径。 - 二级子元素
exclusions
:排除的依赖构件集,即告诉 Maven 只依赖指定的项目,不依赖项目的依赖。此元素主要用于解决版本冲突问题。 - 三级子元素
exclusion
:排除的具体依赖构件集。 - 四级子元素
groupId
、artifactId
:排除的具体依赖构件集的组织 ID 和项目 ID。 - 二级子元素 **
optional
:**表示该依赖是否为可选依赖,阻断依赖的传递性。如果某个库标记为可选,依赖该库的项目必须显式声明它。
2.5、依赖管理
依赖项中的版本可以在依赖管理中进行管理,
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<dependencyManagement>
<dependency>
<!-- 参见 dependencies/dependency 元素 -->
...
</dependency>
...
</dependencyManagement>
...
</project>
配置详细说明:
- 顶级元素 **
dependencies
:**描述了项目相关的所有依赖。 这些依赖组成了项目构建过程中的一个个环节。它们自动从项目定义的仓库中下载。 - 一级子元素 **
dependency
:**表示一个单独的依赖项,包含了该依赖的所有详细信息。内容同dependencies/dependencie
相同。
2.6、属性
POM 属性通常用于存储版本号、项目名称等重复使用的值,以提高配置的可维护性。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 用于整个 POM 文件中引用的属性,以值替代名称 -->
<properties>
<!-- 以下两个属性为 Maven 保留,未来将成为 POM 定义中的元素 -->
<!-- 用于指定项目的源码文件的编码格式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 用于指定生成的报告的输出编码格式 -->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 以下两个属性是专门为 Maven Compiler Plugin(Maven 编译插件)使用的 -->
<!-- 用于指定 Java 编译器的源版本,即代码的最低兼容版本。值通常是 Java 版本号 -->
<maven.compiler.source>8</maven.compiler.source>
<!-- 用于指定编译器生成的目标版本,即编译输出的字节码的最低兼容版本。值通常也为 Java 版本号 -->
<maven.compiler.target>8</maven.compiler.target>
</properties>
...
</project>
配置详细说明:
- 顶级元素 **
properties
:用于整个 POM 文件中引用的属性,以值替代名称。
3、构建设置
3.1、构建元素
在 Maven 项目中,<build>
标签用于定义项目的构建行为和结构。通过它,可以指定默认的构建目标、输出路径等。根据应用场景的不同,<build>
标签可以分为全局和环境配置两类。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 构建插件构建项目需要的信息 -->
<build>
<!-- 当项目没有规定目标(阶段)时的默认值 -->
<defaultGoal>install</defaultGoal>
<!-- 定义构建结果的输出目录,默认路径为 `target` -->
<directory>target</directory>
<!-- 指定构建结果文件的名称,默认值为 `${artifactId}-${version}` -->
<finalName>${artifactId}-${version}</finalName>
<!-- 指定主源代码和测试代码的目录 -->
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<!-- 指定脚本源程序存放目录(脚本不会被编译) -->
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<!-- 指定主代码和测试代码编译后的输出目录 -->
<outputDirectory>target/classes</outputDirectory>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<!-- 用于定义项目资源文件的位置。资源可以是配置文件、图片等静态内容,并支持过滤操作(替换占位符) -->
<resources>
<!-- 定义一个项目资源文件的具体信息 -->
<resource>
<!-- 指定资源文件所在的目录路径,默认在 `${basedir}/src/main/resources` -->
<directory>src/main/resources</directory>
<!-- 是否在构建过程中对资源进行过滤。设置为 `true` 时,会替换文件中的占位符 -->
<filtering>true</filtering>
<!-- 定义包含的文件模式 -->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!-- 定义排除的文件模式 -->
<excludes>
<exclude>**/*.test.xml</exclude>
</excludes>
</resource>
</resources>
<!-- 用于定义项目测试资源文件的位置 -->
<testResources>
<!-- 定义一个项目资源测试文件的具体信息,属性作用与 resource 相同 -->
<testResource>
<directory>src/main/testResources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<excludes>
<exclude>**/*.test.xml</exclude>
</excludes>
</testResource>
</testResources>
<!-- 当 filtering 开关打开时,使用到的过滤器属性文件列表,它通常与 resources 配合使用 -->
<filters>
<!-- 过滤文件,在构建时,Maven 会根据过滤文件中的值将占位符替换成实际的内容 -->
<filter>src/main/filters/dev.properties</filter>
</filters>
<!-- 项目可以引用的默认插件信息 -->
<pluginManagement>
<!-- 使用的插件列表 -->
<plugins>
<plugin>
<!-- 指定插件的坐标 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<!-- 指定插件执行的配置。一个插件可以有多个执行阶段,每个执行阶段可能有不同的配置 -->
<executions>
<!-- 每个 <execution> 定义一个插件在构建生命周期中的具体执行过程 -->
<execution>
<!-- 用于标识此执行的唯一 ID。可以为每个执行指定一个不同的 ID 来区分它们 -->
<id>compile-phase</id>
<!-- 绑定此插件目标执行的生命周期阶段。在这个例子中,插件目标将在 "compile" 阶段执行 -->
<phase>compile</phase>
<!-- 指定插件执行的目标 -->
<goals>
<!-- 目标名称。在此示例中,目标是 "compile",它将执行编译源代码的任务 -->
<goal>compile</goal>
</goals>
</execution>
</executions>
<!-- 指定插件执行的目标,每个插件可以有多个目标,而目标则是执行插件时执行的具体任务 -->
<goals>
<goal>compile</goal>
</goals>
<!-- 指定插件执行时的配置信息。不同的插件会有不同的配置选项 -->
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
<!-- 在插件执行过程中,指定插件所需的额外依赖。这些依赖将被添加到插件的 classpath 中,以支持插件的执行 -->
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.15.0</version>
</dependency>
</dependencies>
<!-- 指定是否继承父 POM 中的插件配置。值可以是 true 或 false。默认为 true,表示会继承父 POM 的配置 -->
<inherited>false</inherited>
<!-- 指定该插件是否作为扩展引入,即它是否扩展 Maven 的构建生命周期或提供额外的功能 -->
<extensions>true</extensions>
</plugin>
</plugins>
</pluginManagement>
<!-- 指定项目的构建过程中使用的插件列表 -->
<plugins>
<plugin>
<!-- 指定插件的坐标 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<!-- 指定插件执行的配置(例如绑定到构建生命周期的阶段)。一个插件可以有多个执行阶段,每个执行阶段可能有不同的配置 -->
<executions>
<!-- 定义一个插件在构建生命周期中的具体执行过程 -->
<execution>
<!-- 用于标识此执行的唯一 ID。可以为每个执行指定一个不同的 ID 来区分它们 ->
<id>compile-phase</id>
<!- 绑定此插件目标执行的生命周期阶段。在这个例子中,插件目标将在 "compile" 阶段执行 -->
<phase>compile</phase>
<!-- 指定插件执行的目标 -->
<goals>
<!-- 目标名称。在此示例中,目标是 "compile",它将执行编译源代码的任务 -->
<goal>compile</goal>
</goals>
</execution>
</executions>
<!-- 指定插件执行的目标,每个插件可以有多个目标,而目标则是执行插件时执行的具体任务 -->
<goals>
<goal>compile</goal>
</goals>
<!-- 指定插件执行时的配置信息。不同的插件会有不同的配置选项 -->
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
<!-- 在插件执行过程中,指定插件所需的额外依赖。这些依赖将被添加到插件的 classpath 中,以支持插件的执行 -->
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.15.0</version>
</dependency>
</dependencies>
<!-- 指定是否继承父 POM 中的插件配置。值可以是 true 或 false。默认为 true,表示会继承父 POM 的配置 -->
<inherited>false</inherited>
<!-- 指定该插件是否作为扩展引入,即它是否扩展 Maven 的构建生命周期或提供额外的功能 -->
<extensions>true</extensions>
</plugin>
</plugins>
<!-- 指定项目的构建过程中使用的额外插件或扩展列表,其特点是额外插件不与 Maven 生命周期绑定 -->
<extensions>
<extension>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.0.0</version>
</extension>
</extensions>
</build>
...
</project>
配置详细说明:
- 顶级元素 **
build
:**用于定义项目的构建行为和结构。 - 一级子元素
defaultGoal
: 当执行mvn
命令且未指定目标时,默认执行的目标。 - 一级子元素
directory
: 定义构建结果的输出目录,默认路径为target
。 - 一级子元素
finalName
: 指定构建结果文件的名称,默认值为${artifactId}-${version}
。 - 一级子元素
sourceDirectory
和testSourceDirectory
: 指定主源代码和测试代码的目录。 - 一级子元素
scriptSourceDirectory
:脚本源程序存放目录(脚本不会被编译)。 - 一级子元素
outputDirectory
和testOutputDirectory
: 指定主代码和测试代码编译后的输出目录。 - 一级子元素
resources
、testResources
: 用于定义项目资源文件的位置。资源可以是配置文件、图片等静态内容,并支持过滤操作(替换占位符) - 二级子元素
directory
: 指定资源文件所在的目录路径,默认在${basedir}/src/main/resources
- 二级子元素
filtering
: 是否在构建过程中对资源进行过滤。设置为true
时,会替换文件中的占位符 - 二级子元素
includes
、excludes
: 定义包含或排除的文件模式。excludes
通常与includes
配合使用,以确保符合某些条件的文件不会被处理。 - 一级子元素 **
plugins
:**定义需要的插件、版本和配置。 - 二级子元素 **
plugin
:**具体的插件信息。 - 三级子元素
groupId
、artifactId
、version
:插件的坐标信息。 - 三级子元素
configuration
:配置插件的属性,如上例中的 Java 版本和编码。 - 三级子元素
executions
:定义插件的执行方式,包括生命周期阶段、目标、唯一标识等。 - 四级子元素
id
:execution
的唯一标识符,便于区别不同的执行任务。 - 四级子元素
phase
: 指定插件的执行阶段。 - 四级子元素 **
goals
:**定义执行的具体目标(goals)。 - 四级子元素 **
configuration
:**配置插件的执行参数。每个execution
可以拥有独立的配置。 - 一级子元素
plugins
:是用于统一管理插件的版本。它在父工程中定义,子工程使用时可以省略版本号,实现插件版本统一管理。
3.2、报告元素
在 Maven 项目中,<reporting>
标签用于定义项目的报告生成行为和结构。通过它,可以指定使用的报告插件、输出位置及生成的报告类型。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 报表插件产生报表需要的信息 -->
<reporting>
<!-- 指定是否排除默认报告,默认情况下,Maven 会生成一组预定义的报告,如果设置为 true,则排除这些默认报告 -->
<excludeDefaults>true</excludeDefaults>
<!-- 指定所有报告的输出目录。默认情况下,报告会存放在 `${project.build.directory}/site` 路径下 -->
<outputDirectory>${project.build.directory}/site</outputDirectory>
<plugins>
<!-- 插件部分,用于定义哪些插件需要生成报告 -->
<plugin>
<!-- 插件的坐标 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
<configuration>
<!-- 配置插件时可以指定特定的配置项(由插件定义) -->
<reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
</configuration>
<reportSets>
<!-- 指定哪些报告集(report set)应由插件生成。每个 `reportSet` 可以包含一个或多个报告 -->
<reportSet>
<!-- 报告集指定唯一的 ID -->
<id>surefire-reports</id>
<reports>
<!-- 需要生成的具体报告的名称 -->
<report>report-name</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
...
</project>
配置详细说明:
- 顶级元素 **
reporting
:**用于定义项目的报告生成行为和结构。通过它,可以指定使用的报告插件、输出位置及生成的报告类型。 - 一级子元素 **
excludeDefaults
:**如果设置为true
,则默认的报告将不包括在内。 - 一级子元素 **
outputDirectory
:**指定生成的报告存放位置,默认为${project.build.directory}/site
。 - 一级子元素
plugins
: 用于定义项目中使用的报告插件及其配置。可以通过插件来生成多种类型的报告,例如代码覆盖率报告、依赖关系报告等。 - 二级子元素 **
plugins
:**具体插件信息。 - 三级子元素
groupId
、artifactId
、version
:报告插件的坐标信息。 - 三级子元素
configuration
:用于配置插件的属性,例如指定报告的生成目录。 - 三级子元素
reportSets
:定义一组报告的配置,每个报告集可能有不同的配置。 - 四级子元素
reportSets
:具体报告信息 - 五级子元素
id
: 报告集的唯一标识符,在 POM 继承时使用。 - 五级子元素
reports
: 包含该集合中使用的具体报告名称。
4、更多项目信息
4.1、简单信息元素
一些元素不会影响构建,而是记录项目以方便开发人员。其中许多元素用于在生成项目网站时填写项目详细信息。但是,与所有 POM 声明一样,插件可以将它们用于任何用途。以下是最简单的元素。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的名称,它不是必需的,一般用于生成网站信息或者文档 -->
<name>lizhengi-demo-maven</name>
<!-- 项目的简短、易读的描述,它不是必需的,一般用于生成网站信息或者文档 -->
<description>This is a demonstration project used to introduce Maven!</description>
<!-- 项目的主页,它不是必需的,一般用于生成网站信息或者文档 -->
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<!-- 项目的首次创建年份,它不是必需的,一般用于生成网站信息或者文档 -->
<inceptionYear>2024</inceptionYear>
...
</project>
配置详细说明:
- 顶级元素
name
:项目的名称,它不是必需的,一般用于生成网站信息或者文档。 - 顶级元素 **
description
:**项目的简短、易读的描述,它不是必需的,一般用于生成网站信息或者文档。 - 顶级元素
url
:项目的主页,它不是必需的,一般用于生成网站信息或者文档。 - 顶级元素 **
inceptionYear
:**项目的首次创建年份,它不是必需的,一般用于生成网站信息或者文档。
4.2、许可证
许可证是定义项目(或项目的一部分)的使用方式和时间的法律文件。项目应列出直接适用于该项目的许可证,而不是列出适用于项目依赖项的许可证。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的许可证信息,它不是必需的,一般用于生成网站信息或者文档 -->
<licenses>
<!-- 定义一个许可证的具体信息 -->
<license>
<!-- 许可证的名称、URL 和备注 -->
<name>Apache-2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
<comments>A business-friendly OSS license</comments>
<!-- 许可证的分发方式 -->
<distribution>repo</distribution>
</license>
</licenses>
...
</project>
配置详细说明:
- 顶级元素 **
licenses
:**用于指定项目的许可证信息。它允许开发者声明项目使用的开源许可证类型,以便其他开发者和用户了解如何使用和分发该项目。 - 一级子元素 **
license
:**具体许可证信息。 - 二级子元素
name
、url
、comments
: 许可证的名称、URL 和备注。 - 二级子元素
distribution
:许可证的分发方式。可能的值包括:repo
(适用于代码仓库(如 Maven 中央仓库)进行分发)、site
(适用于在网站上发布的内容)以及other
(其他)
4.3、组织
大多数项目都是由某种组织(企业、私人团体等)运营的。这里设置了最基本的信息。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的所属组织信息,它不是必需的,一般用于生成网站信息或者文档 -->
<organization>
<!-- 许可证的名称(全称)、URL -->
<name>Lizhengi Org</name>
<url>https://Lizhengi.org</url>
</organization>
...
</project>
配置详细说明:
- 顶级元素
organization
: 用于描述项目所属组织的各种属性,供 Maven 产生的文档使用。 - 一级子元素
name
、url
: 组织的名称、URL 和备注。
4.4、开发人员
所有项目都包含某个人创建的文件。与围绕项目的其他系统一样,参与项目的人员也与项目有利益关系。开发人员可能是项目核心开发的成员。请注意,尽管组织可能有许多开发人员(程序员)作为成员,但将他们都列为开发人员并不是好的做法,而只是列出那些直接负责代码的人。一个好的经验法则是,如果不应该就项目联系此人,则无需在此处列出他们。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的开发者列表,它不是必需的,一般用于生成网站信息或者文档 -->
<developers>
<!-- 定义一个开发者的具体信息 -->
<developer>
<!-- 对应于开发人员的 ID(可能是组织内某个唯一的 ID)、开发人员的姓名、电子邮件地址和主页地址 -->
<id>9527</id>
<name>lizhengi</name>
<email>lizhengi@gmail.com</email>
<url>https://Lizhengi.org/lizhengi</url>
<!-- 对应于开发人员的组织名称及其主页地址 -->
<organization>Lizhengi Org</organization>
<organizationUrl>https://Lizhengi.org</organizationUrl>
<!-- 对应于开发人员在项目中的角色。可以有多个 `role` 元素 -->
<roles>
<!-- 角色名称 -->
<role>architect</role>
<role>developer</role>
</roles>
<!-- 对应于开发人员所在的时区 -->
<timezone>China/Beijing</timezone>
<!-- 用于定义开发者的额外属性 -->
<properties>
<!-- 自定义属性 -->
<!-- ... -->
</properties>
</developer>
</developers>
...
</project>
配置详细说明:
- 顶级元素
developers
: 用于指定项目的开发者列表,以便清晰地展示参与项目开发的人员及其相关信息。这对项目的透明性和管理非常重要,特别是在开源项目中。 - 一级子元素
developer
: 定义一个开发者的详细信息。 - 二级子元素
id
、name
、email
:这些对应于开发人员的 ID(可能是组织内某个唯一的 ID)、开发人员的姓名和电子邮件地址。 - 二级子元素
organization
、organizationUrl
:分别是开发人员的组织名称及其 URL。 - 二级子元素
roles
:描述开发者在项目中的角色。可以有多个role
元素,role
内的值为角色名称。 - 二级子元素
timezone
:开发者所在的时区,以-11
到12
的整数范围表示。例如:-5
表示东部标准时间(EST)。 - 二级子元素
properties
:用于定义开发者的额外属性,如部门等。不同的插件可能会使用这些属性,或者它们可能仅供读取 POM 的其他开发人员使用。
4.5、贡献者
贡献者与开发人员类似,但在项目生命周期中扮演辅助角色。贡献者可能提交了错误修复,或添加了一些重要文档。一个健康的开源项目可能拥有比开发人员更多的贡献者。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的贡献者列表,它不是必需的,一般用于生成网站信息或者文档 -->
<contributors>
<!-- 定义一个贡献者的具体信息,属性与开发人员类似(但没有 ID 属性) -->
<contributor>
<name>benjamin</name>
<email>benjamin@gmail.com</email>
<url>https://Lizhengi.org/benjamin</url>
<organization>Lizhengi Org</organization>
<organizationUrl>https://Lizhengi.org</organizationUrl>
<roles>
<role>tester</role>
</roles>
<timezone>China/Beijing</timezone>
<properties>
<picUrl>https://Lizhengi.org/benjamin/pic</picUrl>
</properties>
</contributor>
</contributors>
...
</project>
配置详细说明:
- 顶级元素
contributors
:贡献者包含与开发人员相同的元素集(无该id
元素)。
5、环境设置
https://maven.apache.org/pom.html#dependencies
5.1、问题管理
这定义了所使用的缺陷跟踪系统(Bugzilla、TestTrack、ClearQuest等)。虽然没有什么可以阻止插件使用此信息来做某事,但它主要用于生成项目文档。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的问题(缺陷)跟踪系统,它不是必需的,主要作为元数据记录问题跟踪系统信息,也可以用于生成网站信息或者文档 -->
<issueManagement>
<!-- 项目的问题跟踪系统名称。如 JIRA、Bugzilla、GitHub Issues、ZenTao(禅道)、BugFree 等 -->
<system>JIRA</system>
<!-- 项目的问题跟踪系统地址 -->
<url>https://issues.apache.org/jira/browse/MY_PROJECT_NAME</url>
</issueManagement>
...
</project>
配置详细说明:
- 顶级元素
issueManagement
:问题跟踪系统的配置,如 JIRA 或 GitHub Issues。 - 一级子元素
system
:指定项目使用的具体问题追踪系统类型。例如,可以是 JIRA、GitHub Issues、Bugzilla 等。 - 一级子元素
issueManagement
:指定指向问题追踪系统的具体 URL,这样用户可以直接访问项目的缺陷列表或创建问题。
5.2、持续集成管理
过去几年中,基于触发器或时间(如每小时或每天)的持续集成构建系统比手动构建更受欢迎。随着构建系统变得更加标准化,运行触发这些构建的系统也变得更加标准化。尽管大多数配置取决于所使用的特定程序(Continuum、Cruise Control 等),但也有一些配置可以在 POM 中进行。Maven 已在通知程序元素集中捕获了一些重复设置。通知程序是通知人们某些构建状态的方式。在下面的例子中,此 POM 设置了一个类型为(表示电子邮件)的通知程序,并配置了在指定的触发器、和 而不是或mail
上使用的电子邮件地址。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的配置与持续集成(CI)系统,它不是必需的,主要作为元数据记录配置与持续集成(CI)系统信息,也可以用于生成网站信息或者文档 -->
<ciManagement>
<!-- 项目的配置与持续集成(CI)系统名称。如 Continuum、Cruise Control、阿里云 DevOps(云效)、腾讯云 DevOps、Jenkins 等 -->
<system>Continuum</system>
<!-- 项目的配置与持续集成(CI)系统地址 -->
<url>http://127.0.0.1:8080/continuum</url>
<!-- Maven 官方认为,虽然大部分构建和触发器配置由具体的 CI 工具决定,但 Maven POM 文件 中也有一些设置可以配置,尤其是与通知相关的设置 -->
<notifiers>
<!-- 指定在构建状态发生变化时,如何通知相关人员(例如通过电子邮件) -->
<notifier>
<!-- 通知的途径 -->
<type>mail</type>
<!-- 发生错误时是否通知 -->
<sendOnError>true</sendOnError>
<!-- 发生失败时是否通知 -->
<sendOnFailure>true</sendOnFailure>
<!-- 发生成功时是否通知 -->
<sendOnSuccess>false</sendOnSuccess>
<!-- 发生警告时是否通知 -->
<sendOnWarning>false</sendOnWarning>
<!-- 扩展配置项 -->
<configuration>
<!-- 自定义属性 -->
<!-- ... -->
</configuration>
<!-- 通知发送到哪里(不赞成使用) -->
<address>continuum@127.0.0.1</address>
</notifier>
</notifiers>
</ciManagement>
...
</project>
配置详细说明:
- 顶级元素
ciManagement
:持续集成系统的配置信息,如 Jenkins。 - 一级子元素
system
:持续集成系统的名字。 - 一级子元素
issueManagement
:该项目使用的持续集成系统的URL(如果持续集成系统有web接口的话)。 - 一级子元素
notifiers
:构建完成时,需要通知的开发者/用户的配置项。包括被通知者信息和通知条件(错误,失败,成功,警告) 。 - 二级子元素
notifier
:配置一种方式,当构建中断时,以该方式通知用户/开发者。 - 三级子元素
type
:传送通知的途径。 - 三级子元素
sendOnError
:发生错误时是否通知 - 三级子元素
sendOnFailure
:发生失败时是否通知 - 三级子元素
sendOnSuccess
:发生成功时是否通知 - 三级子元素
sendOnWarning
:发生警告时是否通知 - 三级子元素
address
:不赞成使用。通知发送到哪里。 - 三级子元素
configuration
:扩展配置项。
5.3、邮件列表
邮件列表是与项目相关人员保持联系的绝佳工具。大多数邮件列表面向开发人员和用户。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目相关邮件列表信息,它不是必需的,一般用于生成网站信息或者文档 -->
<!-- 邮箱列表是一种早期的社区形式,它将发送到特定地址的邮件自动分发给所有订阅成员的通讯工具,用于项目团队或社区成员之间的沟通、讨论和信息共享 -->
<mailingLists>
<!-- 定义一个邮件列表的具体信息 -->
<mailingList>
<!-- 邮件列表的名称 -->
<name>User List</name>
<!-- 发送邮件的地址或链接 -->
<post>user@127.0.0.1</post>
<!-- 订阅邮件的地址或链接 -->
<subscribe>user-subscribe@127.0.0.1</subscribe>
<!-- 取消订阅邮件的地址或链接 -->
<unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>
<!-- 可以浏览邮件信息的 URL 地址 -->
<archive>http://127.0.0.1/user/</archive>
<!-- 用于提供该邮件列表的其他存档链接 -->
<otherArchives>
<otherArchive>https://base.google.com/base/1/127.0.0.1</otherArchive>
</otherArchives>
</mailingList>
</mailingLists>
...
</project>
配置详细说明:
- 顶级元素
mailingLists
:项目的邮件列表信息。 - 顶级元素
mailingList
:描述了项目相关的所有邮件列表。自动产生的网站引用这些信息 - 二级子元素
name
:邮件的名称 - 二级子元素
post
:发送邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 - 二级子元素
subscribe
:订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 - 二级子元素
unsubscribe
:取消订阅邮件的地址或链接,如果是邮件地址,创建文档时,mailto: 链接会被自动创建 - 二级子元素
archive
:可以浏览邮件信息的 URL。
5.4、供应链管理
SCM(软件配置管理,也称为源代码/控制管理,或简称为版本控制)是任何健康项目不可或缺的一部分。如果您的 Maven 项目使用 SCM 系统(确实如此,不是吗?),那么您可以将该信息放入 POM 中。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的源代码/版本控制管理系统,它不是必需的,主要作为元数据记录源代码仓库信息,但也有一些系统可以通过插件读取相关的值并采取相应动作 -->
<scm>
<!-- 表示项目的只读连接 URL,通常用于拉取代码的操作 -->
<connection>scm:svn:http://127.0.0.1/svn/my-project</connection>
<!-- 表示开发者的读写连接 URL,通常用于开发人员的代码提交操作 -->
<developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>
<!-- 标识代码的版本或标签名,通常在发布过程中使用 -->
<tag>HEAD</tag>
<!-- 源码仓库的网页 URL,便于用户直接查看项目的源码仓库 -->
<url>http://127.0.0.1/websvn/my-project</url>
</scm>
...
</project>
配置详细说明:
- 顶级元素
scm
: 用来描述源码控制系统的详细信息。 - 一级子元素
connection
: 表示项目的只读连接 URL,通常用于拉取代码的操作。 - 一级子元素
developerConnection
: 表示开发者的读写连接 URL,通常用于开发人员的代码提交操作。 - 一级子元素
tag
: 标识代码的版本或标签名,通常在发布过程中使用,标识代码的某个稳定版本。 - 一级子元素
url
: 源码仓库的网页 URL,便于用户直接查看项目的源码仓库。
5.5、先决条件
这类标签用于定义项目的属性值和配置文件,便于项目在不同环境中的灵活性。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<prerequisites>
<maven>2.0.6</maven>
</prerequisites>
...
</project>
配置详细说明:
- 顶级元素
prerequisites
: 描述了这个项目构建环境中的前提条件 - 一级子元素
maven
: 构建该项目或使用该插件所需要的Maven的最低版本。
5.6、存储库
存储库是遵循 Maven 存储库目录布局的工件集合。要成为 Maven 存储库工件,POM 文件必须位于结构中$BASE_REPO/groupId/artifactId/version/artifactId-version.pom
。$BASE_REPO
可以是本地(文件结构)或远程(基本 URL);其余布局相同。存储库是收集和存储工件的地方。每当项目对工件有依赖关系时,Maven 将首先尝试使用指定工件的本地副本。如果本地存储库中不存在该工件,它将尝试从远程存储库下载。POM 中的存储库元素指定要搜索的备用存储库。
存储库是 Maven 社区最强大的功能之一。默认情况下,Maven 会搜索https://repo.maven.apache.org/maven2/上的中央存储库。可以在 pom.xml 的“repositories”元素中配置其他存储库。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 发现依赖和扩展的远程仓库列表 -->
<!-- Maven 的仓库查找顺序:1.本地仓库 > 2.项目中定义的 repositories 和 pluginRepositories 中定义的仓库 > 3.settings.xml 中定义的仓库 > 4.中央仓库(Maven Central) -->
<repositories>
<!-- 定义一个发现依赖和扩展的远程仓库的具体信息 -->
<repository>
<!-- 远程仓库唯一标识符、名称和 URL 地址 -->
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
<!-- 指定仓库的布局类型,这里的选项是:default(默认的 Maven 仓库布局);legacy(旧版布局,较少使用,适用于与非常老的 Maven 仓库兼容的情况) -->
<layout>default</layout>
<!-- 用于控制仓库对快照版本的处理,包括是否启用快照版本的下载和更新策略(实际上 Maven 是允许同一个版本号下不断地发布更新的) -->
<snapshots>
<!-- 表示该仓库是否为下载某种类型构件(发布版,快照版)开启 -->
<enabled>true</enabled>
<!-- 指定更新发生的频率(构建项目时通过命令行触发)。Maven会比较本地POM和远程POM的时间戳,这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不) -->
<updatePolicy>daily</updatePolicy>
<!-- 当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告) -->
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<!-- 用于控制仓库对发布版本的处理,包括是否启用发布版本的下载和更新策略 -->
<releases>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
</repository>
</repositories>
...
</project>
配置详细说明:
- 顶级元素
repositories
: 发现依赖和扩展的远程仓库列表 - 一级子元素
repository
: 包含需要连接到远程仓库的信息。 - 二级子元素
releases
、snapshots
:如何处理远程仓库里发布版本的下载。如何处理远程仓库里快照版本的下载。 - 三级子元素
enabled
:true 或者 false 表示该仓库是否为下载某种类型构件(发布版,快照版)开启。 - 三级子元素
updatePolicy
:指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。 - 三级子元素
checksumPolicy
:当 Maven 验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告)。 - 二级子元素
id
、name
、url
:远程仓库唯一标识符、名称和 URL 地址。 - 二级子元素
layout
:用于定位和排序构件的仓库布局类型-可以是 default(默认)或者 legacy(遗留)。
5.7、插件库
存储库是两种主要工件类型的所在地。第一种是用作其他工件依赖项的工件。这些是位于中央的大多数工件。另一种工件是插件。Maven 插件本身是一种特殊类型的工件。因此,插件存储库可以与其他存储库分开(尽管我还没有听到令人信服的理由这样做)。无论如何,pluginRepositories
元素块的结构与元素相似repositories
。pluginRepository
每个元素都指定 Maven 可以找到新插件的远程位置。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 发现插件的远程仓库列表,这些插件用于构建和报表 -->
<pluginRepositories>
<!-- 定义一个发现插件的远程仓库的具体信息,属性作用与 repositories 相同 -->
<pluginRepository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<releases>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
</pluginRepository>
</pluginRepositories>
...
</project>
配置详细说明:
- 顶级元素
pluginRepositories
: 发现插件和扩展的远程仓库列表 - 一级子元素 ``pluginRepositorie
: 包含需要连接到远程仓库的信息。内容与
repositories/repositorie` 一致。
5.8、分发管理
分发管理的作用正如其名称所示:它管理整个构建过程中生成的工件和支持文件的分发。
在 POM 中,repositories
元素指定 Maven 下载当前项目使用的远程工件的位置和方式,而 distributionManagement
指定部署后该项目将在哪里(以及如何)获取远程存储库。如果未定义 snapperRepository
,则将使用存储库元素进行快照分发。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 项目的分发管理,它指定了 Maven 项目的构建产物(如 JAR、WAR 文件)最终要发布的目标位置 -->
<distributionManagement>
<!-- 指定发布构建产物(如 JAR、WAR 文件)到的远程仓库 -->
<repository>
<!-- 远程仓库唯一标识符、名称和 URL 地址 -->
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
<!-- 指定仓库的布局类型,这里的选项是:default(默认的 Maven 仓库布局);legacy(旧版布局,较少使用,适用于与非常老的 Maven 仓库兼容的情况) -->
<layout>default</layout>
<!-- 用于控制仓库对快照版本的处理,包括是否启用快照版本的下载和更新策略(实际上 Maven 是允许同一个版本号下不断地发布更新的) -->
<snapshots>
<!-- 表示该仓库是否为下载某种类型构件(发布版,快照版)开启 -->
<enabled>true</enabled>
<!-- 指定更新发生的频率(构建项目时通过命令行触发)。Maven会比较本地POM和远程POM的时间戳,这里的选项是:always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不) -->
<updatePolicy>daily</updatePolicy>
<!-- 当Maven验证构件校验文件失败时该怎么做:ignore(忽略),fail(失败),或者warn(警告) -->
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<!-- 用于控制仓库对发布版本的处理,包括是否启用发布版本的下载和更新策略 -->
<releases>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
</repository>
<!-- 用于指定存放快照版本(SNAPSHOT)的仓库,与 repository 类似 -->
<snapshotRepository>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/nexus/content/groups/public/</url>
<layout>default</layout>
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<releases>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
</snapshotRepository>
<!-- 指定项目站点(即项目文档和报告)发布的目标位置 -->
<site>
<!-- 站点的 ID、名称和主页地址 -->
<id>mojo.website</id>
<name>Mojo Website</name>
<url>scp://beaver.codehaus.org/home/projects/mojo/public_html/</url>
</site>
<!-- 指定构建产物的下载 URL。如果发布的构建产物需要在其他地方下载,这个 URL 就提供了一个有效的链接 -->
<downloadUrl>https://lizhengi.com/download</downloadUrl>
<!-- 如果构件有了新的 group ID和 artifact ID(构件移到了新的位置),这里列出构件的重定位信息 -->
<relocation>
<groupId>org.apache</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
<message>We have moved the Project under Apache</message>
</relocation>
<!-- 给出该构件在远程仓库的状态 status。不得在本地项目中设置该元素,因为这是工具自动更新的 -->
<!-- <status>none</status> -->
</distributionManagement>
...
</project>
配置详细说明:
- 顶级元素
distributionManagement
: 项目分发信息,在执行mvn deploy
后表示要发布的位置。有了这些信息就可以把网站部署到远程服务器或者把构件部署到远程仓库。 - 一级子元素
repository
、snapshotRepository
:部署项目产生的构件到远程仓库需要的信息、构件的快照部署到哪里?如果没有配置该元素,默认部署到repository
元素配置的仓库。 - 二级子元素
id
、name
:id
用于在众多存储库中唯一地标识此存储库,并且name
是人类可读的形式。 - 二级子元素
uniqueVersion
:唯一版本采用true
或false
值来表示部署到此存储库的工件是否应获取唯一生成的版本号,或者使用作为地址一部分定义的版本号。 - 二级子元素
url
:这是存储库元素的核心。它指定了将构建的工件(以及 POM 文件和校验和数据)传输到存储库的位置和传输协议。 - 二级子元素
layout
:这些元素的类型和用途与在存储库元素中定义的布局元素相同。它们是default
和legacy
。 - 一级子元素
site
:不仅仅是分发到存储库,distributionManagement
还负责定义如何部署项目的站点和文档。 - 二级子元素
id
、name
、url
:这些元素与上面元素中的对应元素类似distributionManagement
repository
。 - 一级子元素
relocation
:如果构件有了新的 group ID和 artifact ID(构件移到了新的位置),这里列出构件的重定位信息。 - 二级子元素
groupId
、artifactId
、version
:构建新地址坐标。 - 二级子元素
message
:除了指定新地址外,提供一条消息解释原因也是很好的做法。 - 一级子元素
downloadUrl
:项目下载页面的 URL。如果没有指定,用户将被引导至 url 指定的主页。指定该 URL 是为了帮助查找由于许可限制而未包含在存储库中的工件。 - 一级子元素
status
:给出该构件在远程仓库的状态。不得在本地项目中设置该元素,因为这是工具自动更新的。
5.9、配置管理
POM 4.0 的一个新功能是项目能够根据构建环境更改设置。元素 profile
包含可选激活(配置文件触发器)和激活该配置文件后要对 POM 进行的一组更改。例如,为测试环境构建的项目可能指向与最终部署不同的数据库。或者,可以根据所使用的 JDK 版本从不同的存储库中提取依赖项。
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<!-- 配置管理,使项目能够根据构建环境更改设置 -->
<profiles>
<!-- 单个构建环境下的配置 -->
<profile>
<id>dev</id>
<!-- 自动触发 profile 的条件逻辑 -->
<activation>
<!-- 布尔标志,确定配置文件是否默认处于活动状态。仅当没有其他配置文件通过命令行明确激活`settings.xml`或通过其他激活器隐式激活时,才会评估此标志,否则无效 -->
<activeByDefault>false</activeByDefault>
<!-- 当匹配的 jdk 被检测到,profile 被激活 -->
<jdk>8</jdk>
<!-- 当匹配的操作系统属性被检测到,profile 被激活 -->
<os>
<!-- 激活 profile 的操作系统的名字、所属家族(如 'windows')、 操作系统体系结构、操作系统版本 -->
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<!-- 如果 Maven 检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile 就会被激活 -->
<name>sparrow-type</name>
<value>African</value>
</property>
<!-- 提供一个文件名,通过检测该文件的存在或不存在来激活 profile -->
<file>
<!-- 检查文件是否存在,如果存在则激活 profile -->
<exists>${basedir}/file2.properties</exists>
<!-- 检查文件是否存在,如果不存在则激活 profile -->
<missing>${basedir}/file1.properties</missing>
</file>
</activation>
<!-- profile 可以重新定义大多数的一级标签属性:包括 id、modules、dependencies、dependencyManagement、build、reporting、properties、distributionManagement、repositories 以及 pluginRepositories -->
<!-- profile 的作用是在特定的构建环境下根据不同需求调整项目的构建配置,而全局配置(settings.xml)和项目级配置(pom.xml)在没有冲突时依然会被使用,只有当配置重复时,profile 中的配置才会覆盖这些默认的配置。-->
<!-- ... -->
</profile>
<profile>
<id>prod</id>
<activation>
<jdk>21</jdk>
</activation>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
</profile>
</profiles>
...
</project>
配置详细说明:
- 顶级元素
profiles
:在列的项目构建 profile,如果被激活,会修改构建处理。 - 一级子元素
id
:构建配置的唯一标识符。即用于命令行激活,也用于在继承时合并具有相同标识符的 profile。。 - 一级子元素
activation
:自动触发 profile 的条件逻辑。 - 二级子元素
activeByDefault
:布尔标志,确定配置文件是否默认处于活动状态。仅当没有其他配置文件通过命令行明确激活settings.xml
或通过其他激活器隐式激活时,才会评估此标志,否则无效。 - 二级子元素
jdk
:当匹配的 jdk 被检测到,profile 被激活。例如,1.4 激活 JDK1.4,1.4.0_2,而 !1.4激活所有版本不是以 1.4 开头的 JDK。 - 二级子元素
os
:当匹配的操作系统属性被检测到,profile 被激活。os 元素可以定义一些操作系统相关的属性 - 三级子元素
name
:激活 profile 的操作系统的名字 - 三级子元素
family
:激活 profile 的操作系统所属家族(如 ‘windows’) - 三级子元素
arch
:激活 profile 的操作系统体系结构 - 三级子元素
version
:激活 profile 的操作系统版本 - 二级子元素
property
:如果 Maven 检测到某一个属性(其值可以在POM中通过${名称}引用),其拥有对应的名称和值,Profile 就会被激活。 - 三级子元素
name
:激活 profile 的属性的名称 - 三级子元素
value
:激活 profile 的属性的值 - 二级子元素
file
:提供一个文件名,通过检测该文件的存在或不存在来激活 profile。 - 三级子元素
exists
:检查文件是否存在,如果存在则激活 profile。 - 三级子元素
missing
:检查文件是否存在,如果不存在则激活 profile。