pom.xml
文件的第一层标签定义了 Maven 项目的基本元数据和构建配置。下面是这些标签的分析,这些标签提供了对 Maven 项目的详细描述和完全的构建配置。通常,不需要在每个项目中都使用这些标签,只有当需要的时候才定义相应的标签。
pom.xml
文件中的二级标签列表
- 项目基本信息:
modelVersion
、groupId
、artifactId
、version
、packaging
name
、description
、url
、inceptionYear
、organization
、licenses
- 项目关系定义:
parent
、modules
- 项目人员和通信:
developers
、contributors
、mailingLists
- 项目环境和管理:
prerequisites
、scm
、issueManagement
、ciManagement
、distributionManagement
- 项目依赖和插件管理:
dependencyManagement
、dependencies
、repositories
、pluginRepositories
- 构建相关:
build
、reports
、reporting
- 其他:
properties
、profiles
-
项目基本信息:
-
modelVersion
: 指定当前POM
的模型版本,通常这个值都是4.0.0
。<!-- 对于 Maven 2 和 Maven 3,其唯一的值(也是必须的值)是 4.0.0。这是为了确保向后兼容性,因为 Maven 3 能够构建为 Maven 2 设计的 POMs --> <modelVersion>4.0.0</modelVersion>
-
groupId
: 定义项目属于哪个组。这通常是组织的唯一标识符,如公司的域名反转(如com.example
)。 -
artifactId
: 定义项目的基本名称。 -
version
: 指定项目的版本。<!-- 1. 稳定版本 (Release Versions):这是最终用户通常使用的版本,表示稳定且已经过测试的代码。例子:1.0.0, 1.5, 2.3.4 等。 2. 快照版本 (Snapshot Versions):表示项目的当前开发版本,可能会经常更改。快照版本以 SNAPSHOT 结尾。例子:1.0.0-SNAPSHOT, 2.3-SNAPSHOT。 - 快照版本在 Maven 仓库中特别,因为当构建快照版本的项目时,如果仓库中存在新的版本,它将自动获取更新。 3. 里程碑 (Milestone)、候选 (Candidate) 和 Alpha/Beta 版本:这些版本用于在正式发布之前进行中间发布,以收集反馈。例如:1.0.0-M1 (第一个里程碑)、1.0.0-RC1 (第一个发布候选)、1.0.0-alpha1、1.0.0-beta1 等。 --> <version>6.4.1</version> <!-- 对于多模块项目,子模块通常会从其父 POM 继承版本。在这种情况下,子模块的 pom.xml 中可能不会明确指定 version 标签,而是默认使用父 POM 中的版本。 --> <!-- 版本号约定: 这涉及到版本号的格式为 MAJOR.MINOR.PATCH,其中每个组件有特定的含义: MAJOR 表示做出了向后不兼容的 API 更改。 MINOR 表示向下兼容的新特性。 PATCH 表示向下兼容的 bug 修复。 -->
-
packaging
: 定义项目的打包方式,如jar
、war
等。<!-- 默认值,当您使用此值,Maven 会生成一个 JAR 文件,适用于 Java 库或应用程序。 --> <packaging>jar</packaging> <!-- 使用此值,Maven 会生成一个 WAR 文件。适用于 Java Web 应用程序,可以部署到 servlet 容器,如 Tomcat。 --> <packaging>war</packaging> <!-- 使用此值,Maven 会生成一个 EAR 文件。适用于企业级 Java 应用程序,通常包含多个模块,可以部署到 Java EE 容器。 --> <packaging>ear</packaging> <!-- 使用此值,项目不会生成任何主构建输出(如 JAR 或 WAR),但它允许您定义一个包含依赖关系、插件或其他元素的 POM,而不关联具体的构建产物。 常见用例是父 POM 或聚合项目。 --> <packaging>pom</packaging>
-
name
: 项目的显示名称。 -
description
: 项目的描述。 -
url
: 项目的官方网址。 -
inceptionYear
: 项目的开始年份。<!-- 用于记录项目的起始年份。对构建过程没有直接的影响 --> <inceptionYear>2020</inceptionYear>
-
organization
: 描述项目所属的组织信息。
-
-
项目关系定义:
-
parent
: 指定项目的父项目。多模块项目或继承关系中常用。<!-- 使用parent的目的: 1. 集中管理:允许您在父项目中集中管理公共的构建配置,然后由子项目继承。这确保了一致性并减少了冗余。 2. 版本管理 : 可以在父 POM 中定义版本号,所有子模块可以继承这个版本号,这样就不需要在每个模块中单独设置版本。 3. 定义公共依赖:在父 POM 中定义的依赖关系可以被所有子模块继承,这确保了所有模块使用相同的依赖版本。 --> <parent> <groupId>com.example</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> <!-- 可选的 relativePath 元素。默认情况下,Maven 会在当前项目的基目录的 .. (上一级目录) 中查找父 POM。 但是,如果父 POM 位于其他位置,可以使用 relativePath 来指定。 如果从远程仓库中获取父 POM,将忽略 relativePath。 --> <relativePath>../pom.xml</relativePath> </parent>
-
modules
: 指定此项目包含的模块。通常用于多模块项目。<!-- 用于定义一个多模块(或称为聚合)项目。多模块项目允许您一次构建多个模块。每个模块都是一个独立的项目,但它们共同构成一个大型项目。当您运行 Maven 命令(如 mvn install)在多模块项目的根目录下时,该命令会自动应用到每个子模块。 --> <modules> <module>module1</module> <module>module2</module> <module>module3</module> </modules> <!-- 构建顺序:Maven 会根据 pom.xml 文件中模块的列出顺序来构建它们。如果模块之间有依赖关系,您需要确保依赖的模块先于依赖它的模块被列出。 子模块 POM:每个子模块的目录都应包含一个 pom.xml 文件。这个文件定义了该模块的特定配置,例如其依赖关系和插件。同时,子模块通常会使用 parent 标签来引用其父 POM,从而继承共享的配置。 与 modules 标签一起使用时,父 POM 通常会设置 packaging 值为 pom, -->
-
-
项目人员和通信:
项目人员信息和通信信息可以用到持续集成\持续部署中
通常会使用持续集成/持续部署(
CI/CD
)工具(如Jenkins
、GitLab CI
、Travis CI
等)与相关的插件或脚本来实现自动发通知的功能。-
developers
: 定义项目开发者的信息。<developers> <developer> <!-- 唯一标识这位开发者的 ID。这是一个简短的字符串,通常是开发者的用户名或简称。 --> <id>johndoe</id> <!-- 开发者的全名 --> <name>John Doe</name> <!-- 开发者的电子邮件地址。 --> <email>johndoe@example.com</email> <!-- 开发者的个人网站或相关的 URL。 --> <url>http://www.example.com/johndoe</url> <!-- 开发者所属的组织或公司名称。 --> <organization>Example Inc.</organization> <!-- 组织或公司的网址。 --> <organizationUrl>http://www.example.com</organizationUrl> <!-- 列出开发者在项目中的角色。它可以包含多个 role 子标签。例如,开发者可能是 "developer", "architect", "tester" 等。 --> <roles> <role>developer</role> <role>architect</role> </roles> <!-- 开发者所在的时区,例如 "+8" 代表 UTC+8。 --> <timezone>+8</timezone> <!-- 社交媒体和其他平台的句柄:例如示例中的 Twitter 和 GitHub 用户名。 个性化信息:例如,开发者的昵称、使用的 IDE、专长领域等 --> <properties> <twitterHandle>@johndoe</twitterHandle> <githubUsername>johndoe123</githubUsername> </properties> </developer> <!-- 更多开发者信息... --> </developers>
-
contributors
: 列出为项目做出贡献但不是主要开发者的人。<contributors> <contributor> <!-- 子标签内容和`developers`下的子标签`developer`的内容一致 --> </contributor> <!-- 更多贡献者信息... --> </contributors>
-
mailingLists
: 关于项目的邮件列表。<mailingLists> <!-- 每个mailingList代表一个特定的邮件列表 --> <mailingList> <!-- name: 邮件列表的名称或简称。 --> <name>Project Users</name> <!-- subscribe: 订阅邮件列表的邮件地址。 --> <subscribe>users-subscribe@example.com</subscribe> <!-- unsubscribe: 退订邮件列表的邮件地址。 --> <unsubscribe>users-unsubscribe@example.com</unsubscribe> <!-- post: 用于发送新邮件到邮件列表的地址。 --> <post>users@example.com</post> <!-- archive: 该邮件列表的存档或历史消息的 URL。 --> <!-- otherArchives: 一个包含其他存档 URL 的列表。通常,一个邮件列表只有一个主要的存档,但有时可能有额外的镜像或其他来源的存档。 --> <archive>http://www.example.com/mailing-lists/users</archive> </mailingList> </mailingLists>
-
-
项目环境和管理:
-
prerequisites
: 指定构建此项目所需的 Maven 版本和JDK
版本。<!-- 这个标签主要针对 Maven 插件的开发,用于指定插件运行所需的 Maven 版本 --> <!-- 虽然 prerequisites 可以用于指定 Maven 的版本,但它不应该用于常规的项目构建。对于常规项目,建议使用 Maven Enforcer 插件来强制执行特定的 Maven 和 JDK 版本 --> <prerequisites> <maven>3.1.0</maven> </prerequisites>
-
scm
(Source Control Management): 指定项目的源码管理信息,如 Git。<!-- 指定 scm 信息有助于其他开发者和工具(如持续集成工具)知道如何获取和与项目的源代码交互。 --> <scm> <!-- connection 提供了一个只读的 Git 连接 --> <connection>scm:git:git://github.com/username/projectname.git</connection> <!-- developerConnection 提供了一个使用 SSH 的可写连接 --> <developerConnection>scm:git:ssh://github.com/username/projectname.git</developerConnection> <!-- url 是项目在 GitHub 上的网页 URL --> <url>http://github.com/username/projectname</url> <!-- tag 是版本控制系统中的标签,这里是 HEAD,表示最新的代码 --> <tag>HEAD</tag> </scm>
-
issueManagement
: 定义项目的问题跟踪系统。<!-- 用于描述项目问题跟踪系统的信息。问题跟踪系统通常用于追踪缺陷、改进请求、新功能以及其他与项目相关的问题或需求。 --> <issueManagement> <!-- system: 问题跟踪系统的名称,如 "JIRA", "Bugzilla", "GitHub" 等。 --> <system>GitHub</system> <!-- url: 项目的问题跟踪系统的 URL,通常是一个网页,用户可以在那里查看、报告和跟踪问题。 --> <url>https://github.com/username/projectname/issues</url> </issueManagement>
-
ciManagement
(Continuous Integration, CI): 定义项目的持续集成信息。<!-- ciManagement 标签帮助开发人员和工具知道项目是如何在 CI 服务器上进行构建和测试的。 --> <ciManagement> <!-- system: CI 系统的名称,如 "Jenkins", "Travis CI", "CircleCI", "GitHub Actions" 等。 --> <system>Jenkins</system> <!-- url: CI 系统的基本 URL,通常是项目在 CI 服务器上的构建或仪表板页面。 --> <url>https://jenkins.example.com/job/projectname/</url> <!-- notifiers: 这个子标签用于定义通知策略,例如构建失败时应通知谁。其中可以包含多个 notifier 子标签。 --> <notifiers> <notifier> <!-- type: 通知的方式,如 "mail", "irc", "jabber" 等。 --> <type>mail</type> <!-- sendOnError: 是否在构建错误时发送通知(默认为 true) sendOnFailure|sendOnSuccess|sendOnWarning --> <sendOnError></sendOnError> <!-- configuration: 这个子标签可以包含与通知类型相关的具体配置信息,如电子邮件地址、IRC 频道等。 --> <configuration> <address>dev-team@example.com</address> </configuration> </notifier> </notifiers> </ciManagement>
-
distributionManagement
: 控制项目的发布,包括部署站点和仓库。<!-- 如何发布项目构建的产物。这可以包括项目的发行版和站点文档。 --> <distributionManagement> <!-- repository: 定义了项目构建的主要产物(通常是 JAR 文件)应该发布到哪个远程仓库。常见于发布 release 版本。 --> <repository> <!-- 仓库的唯一标识符。这可以用来匹配 Maven settings.xml 文件中的服务器配置,以提供认证信息。 --> <id>release-repo</id> <!-- name: 仓库的名字。 --> <name>Releases</name> <!-- url: 仓库的 URL。 --> <url>https://repo.example.com/releases</url> </repository> <!-- 专门用于发布快照版本的产物。 --> <snapshotRepository> <id>snapshot-repo</id> <name>Snapshots</name> <url>https://repo.example.com/snapshots</url> </snapshotRepository> <!-- site: 定义了 Maven 生成的项目网站应该发布到哪里。 --> <site> <!-- id: 网站的唯一标识符。 --> <id>project-site</id> <!-- name: 网站的名字。 --> <name>Project Website</name> <!-- url: 网站的 URL。 --> <url>ftp://example.com/public_html/project-site</url> </site> </distributionManagement>
-
-
项目依赖和插件管理:
-
dependencyManagement
: 定义项目的依赖版本管理,常用于多模块项目统一管理版本。<!-- 标签内部本身不会实际声明依赖,而是为你的项目中的子模块提供了一种方式来统一管理版本号和其他依赖的属性。 特点: 统一版本管理:这避免了在多模块项目中的版本冲突,因为所有模块都使用同样的依赖版本。 便于维护:当需要更新依赖版本时,只需在一个地方进行更改。 不引入依赖:仅在 dependencyManagement 中定义的依赖不会被实际加入到项目中,除非它们也被明确地声明在 dependencies 标签中。 --> <dependencyManagement> <dependencies> <dependency> <!--在项目的任何子模块中,当我们要添加这些 Spring 依赖时,只需要提供 groupId 和 artifactId,而不需要提供 version,--> <groupId>com.sample</groupId> <artifactId>sample-library</artifactId> <version>1.0.0</version> <scope>test</scope> <!-- 依赖排除 --> <exclusions> <exclusion> <groupId>org.unwanted</groupId> <artifactId>unwanted-library</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement>
-
dependencies
: 列出项目的所有依赖。<!-- 用于声明项目的直接依赖。这些依赖可以是库、框架或其他项目,它们是当前项目编译、测试和运行所需的。 --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.10</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> <!-- 依赖排除 --> <exclusions> <exclusion> <groupId>org.unwanted</groupId> <artifactId>unwanted-library</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
下面是 scope 的主要取值及其含义:
compile
(默认值): 依赖在所有的类路径中都可用,也会被包含在发布的构建产物中。如果你没有指定scope
,那么默认就是compile
。
provided
: 这表示你期望JDK
或一个容器提供这个依赖。例如,当开发一个servlet
,Tomcat
或其他的servlet
容器会提供servlet-api.jar
。此依赖在运行时不需要Maven
提供。
runtime
: 该依赖在运行时和测试系统的执行环境中是必须的,但在编译时不是必需的。一个例子是JDBC
驱动。
test
: 该依赖仅用于测试,不用于正常的编译或运行。
system
: 该依赖必须从文件系统中明确提供,而不是从仓库中。这与provided
类似,但需要通过systemPath
指定 JAR 文件的路径。这种作法并不推荐,因为它与文件系统的具体布局有关,可能导致构建的非可移植性。 -
repositories
: 定义项目需要访问的远程仓库。<!-- 声明项目应从哪些远程仓库下载依赖。默认情况下,Maven 会从中央仓库 (Central Repository) 下载依赖,但有时你可能需要从其他仓库下载依赖,或者你的组织有自己的内部仓库。 --> <repositories> <repository> <!-- id 是仓库的唯一标识符,用于在 Maven 的输出和 settings.xml 文件中区分不同的仓库。 --> <id>my-internal-site</id> <!-- url 是仓库的地址。 --> <url>http://repo.mycompany.com/maven2</url> </repository> </repositories> <!-- 仓库优先级别(本地仓库最优先,最后是中央仓库): 中央仓库,这是默认的仓库 镜像仓库,通过 sttings.xml 中的 settings.mirrors.mirror 配置 全局profile仓库,通过 settings.xml 中的 settings.repositories.repository 配置 项目仓库,通过 pom.xml 中的 project.repositories.repository 配置 项目profile仓库,通过 pom.xml 中的 project.profiles.profile.repositories.repository 配置 本地仓库 -->
-
pluginRepositories
: 定义插件需要访问的远程仓库。<!-- 项目应从哪些远程仓库下载 Maven 插件,就像依赖可以从远程仓库中获取一样 --> <pluginRepositories> <pluginRepository> <!-- id 是插件仓库的唯一标识符,用于在 Maven 的输出和 settings.xml 文件中区分不同的插件仓库。 --> <id>my-internal-site</id> <!-- url 是插件仓库的地址 --> <url>http://repo.mycompany.com/maven2</url> </pluginRepository> </pluginRepositories>
-
-
构建相关:
-
build
: 定义项目的构建配置,如插件、资源等。<build> <!-- 项目的主要 Java 源代码的位置,默认为 src/main/java。 --> <sourceDirectory/> <!-- 项目的测试 Java 源代码的位置,默认为 src/test/java。 --> <scriptSourceDirectory/> <!-- 存放项目脚本的位置,默认为 src/main/scripts。 --> <testSourceDirectory/> <!-- 编译后的字节码文件的位置,默认为 target/classes。 --> <outputDirectory/> <!-- 测试代码编译后的字节码文件的位置,默认为 target/test-classes。 --> <testOutputDirectory/> <!-- 资源是项目构建过程中的非代码文件,例如属性文件或图片。 --> <resources> <resource> <directory>src/main/resources</directory> <!-- 是否需要进行占位符替换,如配置文件中的 version=${app.version} --> <filtering>true</filtering> </resource> </resources> <!-- 资源是项目构建过程中的非代码文件,例如属性文件或图片。 --> <testResources></testResources> <!--dependencyManagement 和 pluginManagement 都是用来在 Maven 多模块项目中提供统一管理的机制,但它们分别应用于依赖和插件。这种管理机制有助于简化配置,确保版本的一致性,减少在多模块项目中的重复配置。--> <pluginManagement> <plugins> …… </plugins> </pluginManagement> <!-- 插件绑定,在plugins定义插件列表 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <!-- <dependencies> 允许您为插件添加或覆盖所需的库或资源,从而精确地控制插件的行为。 --> <dependencies> <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-compiler-javac</artifactId> <version>2.8.7</version> </dependency> </dependencies> <!-- <source> 和 <target> 是特定于 maven-compiler-plugin 的配置参数。这两个参数用于指定编译源代码和生成字节码的 Java 版本 --> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
extensions
和plugins
都是 Maven 用来扩展其核心功能的机制,但它们之间存在一些关键差异:plugins
:Maven 插件主要用于在 Maven 构建生命周期中的特定阶段执行任务。只影响特定的生命周期阶段extensions
:构建扩展用于扩展 Maven 的核心功能。可能影响整个构建过程 -
reports
: 已经不再推荐使用,之前是用于Maven 1.x
。 -
reporting
: 定义项目的报告插件配置。<!-- 定义了与项目报告相关的配置。Maven 不仅仅是一个构建工具;它还支持使用各种插件生成项目报告,这些报告可以包括例如代码覆盖率、代码质量度量、Javadoc、项目依赖关系等内容。 --> <reporting> <!-- 指定报告的输出目录 --> <outputDirectory>${project.build.directory}/my-reports</outputDirectory> <!-- 配置报告插件 --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>3.3.0</version> </plugin> </plugins> </reporting>
-
-
其他:
-
properties
: 定义项目中使用的属性,可以在其他地方引用。<!-- <properties> 标签允许您定义一系列的键值对,这些键值对可以在 POM 文件的其他地方使用。这种机制提供了一种灵活的方式来配置和复用 POM 中的各种值,使您的 POM 文件更加简洁和易于管理。 --> <properties> <!-- 定义版本号: 如果您的项目使用了多个与某个特定库或框架相关的依赖,并且它们都使用了相同的版本号,那么使用属性来定义该版本号会很有用。这样,当您需要更新版本时,只需更改一次属性值。 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 指定项目配置: 您可以定义与项目配置相关的各种属性,例如编译器版本、字符编码等。 --> <junit.version>5.7.0</junit.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit-jupiter</artifactId> <version>${junit.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> </build>
-
profiles
: 定义构建配置的特定情境或情况,如不同的环境。<!-- <profiles> 是一个非常强大的特性,它允许您为项目定义特定的配置集,这些配置集可以基于特定的环境或开发阶段进行选择。例如,您可能希望在开发环境中使用一套依赖和插件,而在生产环境中使用另一套。 --> <profiles> <profile> <id>development</id> <activation> <activeByDefault>true</activeByDefault> <!-- 默认激活这个 profile --> </activation> <properties> <env>dev</env> </properties> <dependencies> <!-- 开发环境特定的依赖 --> </dependencies> </profile> </profiles>
-