pom.xml
文件的第一层标签定义了 Maven 项目的基本元数据和构建配置。下面是这些标签的分析,这些标签提供了对 Maven 项目的详细描述和完全的构建配置。通常,不需要在每个项目中都使用这些标签,只有当需要的时候才定义相应的标签。
maven官方的pom
文件标签介绍信息
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
。
<modelVersion>4.0.0modelVersion>
groupId
: 定义项目属于哪个组。这通常是组织的唯一标识符,如公司的域名反转(如 com.example
)。
artifactId
: 定义项目的基本名称。
version
: 指定项目的版本。
<version>6.4.1version>
packaging
: 定义项目的打包方式,如 jar
、war
等。
<packaging>jarpackaging>
<packaging>warpackaging>
<packaging>earpackaging>
<packaging>pompackaging>
name
: 项目的显示名称。
description
: 项目的描述。
url
: 项目的官方网址。
inceptionYear
: 项目的开始年份。
<inceptionYear>2020inceptionYear>
organization
: 描述项目所属的组织信息。
项目关系定义:
parent
: 指定项目的父项目。多模块项目或继承关系中常用。
<parent>
<groupId>com.examplegroupId>
<artifactId>parent-projectartifactId>
<version>1.0.0version>
<relativePath>../pom.xmlrelativePath>
parent>
modules
: 指定此项目包含的模块。通常用于多模块项目。
<modules>
<module>module1module>
<module>module2module>
<module>module3module>
modules>
项目人员和通信:
项目人员信息和通信信息可以用到持续集成\持续部署中
通常会使用持续集成/持续部署(
CI/CD
)工具(如Jenkins
、GitLab CI
、Travis CI
等)与相关的插件或脚本来实现自动发通知的功能。
developers
: 定义项目开发者的信息。
<developers>
<developer>
<id>johndoeid>
<name>John Doename>
<email>[email protected]email>
<url>http://www.example.com/johndoeurl>
<organization>Example Inc.organization>
<organizationUrl>http://www.example.comorganizationUrl>
<roles>
<role>developerrole>
<role>architectrole>
roles>
<timezone>+8timezone>
<properties>
<twitterHandle>@johndoetwitterHandle>
<githubUsername>johndoe123githubUsername>
properties>
developer>
developers>
contributors
: 列出为项目做出贡献但不是主要开发者的人。
<contributors>
<contributor>
contributor>
contributors>
mailingLists
: 关于项目的邮件列表。
<mailingLists>
<mailingList>
<name>Project Usersname>
<subscribe>[email protected]subscribe>
<unsubscribe>[email protected]unsubscribe>
<post>[email protected]post>
<archive>http://www.example.com/mailing-lists/usersarchive>
mailingList>
mailingLists>
项目环境和管理:
prerequisites
: 指定构建此项目所需的 Maven 版本和 JDK
版本。
<prerequisites>
<maven>3.1.0maven>
prerequisites>
scm
(Source Control Management): 指定项目的源码管理信息,如 Git。
<scm>
<connection>scm:git:git://github.com/username/projectname.gitconnection>
<developerConnection>scm:git:ssh://github.com/username/projectname.gitdeveloperConnection>
<url>http://github.com/username/projectnameurl>
<tag>HEADtag>
scm>
issueManagement
: 定义项目的问题跟踪系统。
<issueManagement>
<system>GitHubsystem>
<url>https://github.com/username/projectname/issuesurl>
issueManagement>
ciManagement
(Continuous Integration, CI): 定义项目的持续集成信息。
<ciManagement>
<system>Jenkinssystem>
<url>https://jenkins.example.com/job/projectname/url>
<notifiers>
<notifier>
<type>mailtype>
<sendOnError>sendOnError>
<configuration>
<address>[email protected]address>
configuration>
notifier>
notifiers>
ciManagement>
distributionManagement
: 控制项目的发布,包括部署站点和仓库。
<distributionManagement>
<repository>
<id>release-repoid>
<name>Releasesname>
<url>https://repo.example.com/releasesurl>
repository>
<snapshotRepository>
<id>snapshot-repoid>
<name>Snapshotsname>
<url>https://repo.example.com/snapshotsurl>
snapshotRepository>
<site>
<id>project-siteid>
<name>Project Websitename>
<url>ftp://example.com/public_html/project-siteurl>
site>
distributionManagement>
项目依赖和插件管理:
dependencyManagement
: 定义项目的依赖版本管理,常用于多模块项目统一管理版本。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.samplegroupId>
<artifactId>sample-libraryartifactId>
<version>1.0.0version>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.unwantedgroupId>
<artifactId>unwanted-libraryartifactId>
exclusion>
exclusions>
dependency>
dependencies>
dependencyManagement>
dependencies
: 列出项目的所有依赖。
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>5.3.10version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.1version>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.unwantedgroupId>
<artifactId>unwanted-libraryartifactId>
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
: 定义项目需要访问的远程仓库。
<repositories>
<repository>
<id>my-internal-siteid>
<url>http://repo.mycompany.com/maven2url>
repository>
repositories>
pluginRepositories
: 定义插件需要访问的远程仓库。
<pluginRepositories>
<pluginRepository>
<id>my-internal-siteid>
<url>http://repo.mycompany.com/maven2url>
pluginRepository>
pluginRepositories>
构建相关:
build
: 定义项目的构建配置,如插件、资源等。
<build>
<sourceDirectory/>
<scriptSourceDirectory/>
<testSourceDirectory/>
<outputDirectory/>
<testOutputDirectory/>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
<testResources>testResources>
<pluginManagement>
<plugins>
……
plugins>
pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.1version>
<dependencies>
<dependency>
<groupId>org.codehaus.plexusgroupId>
<artifactId>plexus-compiler-javacartifactId>
<version>2.8.7version>
dependency>
dependencies>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
plugins>
build>
extensions
和plugins
都是 Maven 用来扩展其核心功能的机制,但它们之间存在一些关键差异:
plugins
:Maven 插件主要用于在 Maven 构建生命周期中的特定阶段执行任务。只影响特定的生命周期阶段
extensions
:构建扩展用于扩展 Maven 的核心功能。可能影响整个构建过程
reports
: 已经不再推荐使用,之前是用于 Maven 1.x
。
reporting
: 定义项目的报告插件配置。
<reporting>
<outputDirectory>${project.build.directory}/my-reportsoutputDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-javadoc-pluginartifactId>
<version>3.3.0version>
plugin>
plugins>
reporting>
其他:
properties
: 定义项目中使用的属性,可以在其他地方引用。
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<junit.version>5.7.0junit.version>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junit-jupiterartifactId>
<version>${junit.version}version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>${project.build.sourceEncoding}encoding>
configuration>
plugin>
plugins>
build>
profiles
: 定义构建配置的特定情境或情况,如不同的环境。
<profiles>
<profile>
<id>developmentid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<env>devenv>
properties>
<dependencies>
dependencies>
profile>
profiles>