阿丹:
还是发现有的同学对于maven的pom文件的标签不是很知道。毕竟大部分开发的场景都是直接复制粘贴就专注的去写代码了。所以这个文章是给小伙伴们在需要扩展一些知识面或者在一些场景下需要的时候使用。
POM文件
POM文件全称是Project Object Model(项目对象模型)文件,它是Apache Maven项目管理工具中至关重要的配置文件,采用XML格式编写,通常命名为pom.xml
,存放在项目的根目录下。POM文件的主要用途包括以下几个方面:
-
项目描述:
- 定义项目的基本信息,如项目名称、版本、组织名(groupId)、项目名(artifactId)等,这些信息有助于唯一标识项目并用于构建和部署。
-
依赖管理:
- 声明项目对外部库(jar文件或者其他模块)的依赖关系,包括依赖的groupId、artifactId和version。Maven会根据这些信息自动下载并管理项目所需要的依赖库,确保项目构建过程中所有必需的库都能正确获取。
-
构建配置:
- 配置项目的构建过程,包括编译选项(如源代码语言级别、字符编码等)、资源过滤规则、插件配置、构建目标(如clean、compile、package、install等)、测试配置等。
-
项目结构规范:
- Maven通过POM文件实现了标准化的项目结构,使得遵循Maven约定的项目可以轻松地被其他开发者理解并维护。
-
插件配置:
- Maven有许多内置插件和第三方插件,POM文件中可以配置这些插件的行为,如打包方式(jar、war、ear等)、源代码和文档生成、单元测试运行、发布部署等任务。
-
继承与聚合:
- POM文件支持层次化和模块化结构,允许项目之间通过
<parent>
标签继承共同的配置和依赖,或者通过<modules>
标签定义项目聚合,便于大型项目拆分成多个子模块进行管理。
- POM文件支持层次化和模块化结构,允许项目之间通过
-
属性定义:
- 在POM文件中可以定义全局属性,这些属性可以在整个POM文件中复用,提高配置的灵活性和可维护性。
总的来说,POM文件是Maven项目的核心配置文件,它定义了项目的所有构建相关配置和元数据,通过Maven的命令行工具或IDE集成插件,可以读取POM文件并按照其中的配置自动化地完成项目的构建、测试、打包和部署等一系列工作流程。
Pom文件标签一览
整个POM(Project Object Model)文件是由一系列的XML元素和属性构成,用来描述项目的所有相关信息和构建规则。以下是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 http://maven.apache.org/maven-v4_0_0.xsd">
<!-- 基本项目信息 -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.group</groupId>
<artifactId>example-artifact</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 项目描述 -->
<name>Example Project</name>
<description>A description of the project.</description>
<url>http://example.com/project</url>
<!-- 组织信息 -->
<organization>
<name>Example Inc.</name>
<url>http://example.com</url>
</organization>
<!-- 开发者信息 -->
<developers>
<developer>
<id>dev1</id>
<name>Developer One</name>
<email>dev1@example.com</email>
</developer>
<!-- 可以添加多个开发者 -->
</developers>
<!-- 依赖管理 -->
<dependencies>
<dependency>
<groupId>com.example.dep</groupId>
<artifactId>dependency-a</artifactId>
<version>1.1.0</version>
</dependency>
<!-- 可以添加多个依赖 -->
</dependencies>
<!-- 插件配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 可以添加多个插件 -->
</plugins>
<!-- 其他构建相关配置,如资源过滤、源码目录、输出目录等 -->
</build>
<!-- 配置远程仓库 -->
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<!-- 可以添加多个仓库 -->
</repositories>
<!-- 更多配置,比如profiles、distributionManagement、properties等 -->
<!-- ... -->
</project>
以上示例展示了POM文件的一些关键部分,包括但不限于:
- modelVersion:指定POM模型的版本。
- groupId、artifactId、version:组成Maven坐标,用于唯一标识项目。
- packaging:定义项目的打包类型(如jar、war、ear等)。
- dependencies:定义项目所需的依赖库列表。
- build:包含构建相关的配置,如插件列表及其配置。
- repositories:声明项目使用的远程仓库列表。
此外,POM还可以包括更多高级配置,如父POM引用(inheritance)、模块管理(modules)、属性定义(properties)、构建profile激活条件(profiles)、部署配置(distributionManagement)、<parent>指定当前项目所继承的父项目的配置信息等。每个元素都有其特定的功能和语义,在Maven构建过程中起着不同的作用。
<dependencies>标签
在Maven的pom.xml
文件中,<dependencies>
标签是一个非常核心的部分,它的主要作用是声明项目所依赖的其他软件模块或库。通过 <dependencies>
标签,您可以详细指定项目在编译、测试、运行时所需要的各种外部组件。
在一个<dependencies>
标签块内,可以包含多个<dependency>
子标签,每一个<dependency>
标签都代表一个具体的依赖项,它至少包含三个子标签:
<dependency>标签
在 Maven 的 <dependency>
标签下,常见的子标签用于详细描述项目所依赖的外部库或其他模块的信息。以下是 <dependency>
标签下一些重要的子标签及其作用:
-
groupId (
<groupId>
):- 用于定义依赖库或模块所在的组织或项目组的唯一标识。例如,
org.springframework.boot
表示 Spring Boot 组织。
- 用于定义依赖库或模块所在的组织或项目组的唯一标识。例如,
-
artifactId (
<artifactId>
):- 用于定义依赖的具体项目或模块的唯一标识。例如,
spring-boot-starter-web
表示 Spring Boot Web 启动器模块。
- 用于定义依赖的具体项目或模块的唯一标识。例如,
-
version (
<version>
):- 指定依赖库或模块的版本号。例如,
2.5.15
表示 Spring Boot 版本为 2.5.15。
- 指定依赖库或模块的版本号。例如,
-
type (
<type>
):- 可选标签,用来定义依赖的类型,默认为
jar
。可能的类型包括jar
、war
、pom
、zip
等。例如,对于某些项目可能是.aar
(Android库) 或.tar.gz
。
- 可选标签,用来定义依赖的类型,默认为
-
classifier (
<classifier>
):- 可选标签,用于进一步区分同一 artifactId 下不同类型的构件输出。例如,不同的构建环境可能产生
-sources
(源代码)、-javadoc
(JavaDoc文档)或其它定制化的构建产物。
- 可选标签,用于进一步区分同一 artifactId 下不同类型的构件输出。例如,不同的构建环境可能产生
-
scope (
<scope>
):- 定义依赖范围,影响依赖在构建生命周期的不同阶段是否可用,以及是否包含在最终打包的工件中。常见的范围有:
compile
(默认):编译和运行时都有效。test
:只在测试编译和测试运行时有效。provided
:表示该依赖由容器或JDK本身提供,编译和测试时有效,但在打包时不包含。runtime
:只在运行时有效,编译时无效。system
:系统依赖,类似 provided,但是必须提供本地系统的路径。
- 定义依赖范围,影响依赖在构建生命周期的不同阶段是否可用,以及是否包含在最终打包的工件中。常见的范围有:
-
systemPath (
<systemPath>
):- 当 scope 为 system 时,用于指定本地系统上依赖文件的路径。
-
optional (
<optional>
):- 如果设为 true,则表明此依赖虽然被当前项目所依赖,但它不会传递给依赖此项目的其他项目。
-
exclusions (
<exclusions>
):- 此标签用于排除传递性依赖中的某些子依赖,避免引入冲突或不需要的库。
<exclusion>
子标签用于列出需要排除的具体依赖,它内部也包含 groupId 和 artifactId。
- 此标签用于排除传递性依赖中的某些子依赖,避免引入冲突或不需要的库。
-
dependencyManagement (
<dependencyManagement>
):- 这个不是
<dependency>
标签下的子标签,而是独立的一个标签,用于集中管理和声明依赖的版本,供项目内的所有<dependency>
引用时共享版本控制,但并不会自动引入依赖。
- 这个不是
总结起来,在实际的 <dependency>
标签结构中,通常是这样的:
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<type>...</type>
<classifier>...</classifier>
<scope>...</scope>
<systemPath>...</systemPath>
<optional>true|false</optional>
<exclusions>
<exclusion>
<groupId>...</groupId>
<artifactId>...</artifactId>
</exclusion>
</exclusions>
</dependency>
不是所有子标签在每个依赖中都必须出现,它们根据实际情况选用。此外,Maven 还有一些高级特性相关的子标签,比如对于 OSGi 项目会用到 <bundle>
标签等,但上述是最常见且基础的子标签。
<properties>标签
Maven的pom.xml
文件中,<properties>
标签用于定义项目级别的属性,这些属性可以在整个POM文件中作为变量使用,从而实现值的复用和集中管理。这样做有助于提高POM文件的可读性和易维护性,同时也能简化不同模块间的依赖管理和版本控制。
<properties>
标签内部可以包含多个子标签,每个子标签就是一个属性,其形式通常为:
<properties>
<propertyName>propertyValue</propertyName>
<!-- 其他属性定义 -->
</properties>
例如:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring.version>5.3.10</spring.version>
</properties>
这里定义了三个属性:project.build.sourceEncoding
、java.version
和spring.version
,它们分别代表了项目的源代码编码格式、Java版本和Spring框架的版本。
这些属性可以在POM文件的其他部分通过${propertyName}
的形式引用,例如:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
在上述示例中,<properties>
标签定义的java.version
和spring.version
属性分别被用在了编译插件的配置中和Spring框架依赖的版本指定上。
需要注意的是,<properties>
标签本身没有特定的子标签,其内部直接定义的就是各种属性名和对应的属性值。不过,在使用这些属性时,它们就像是Maven中的变量,可以替换到POM文件中任何允许文本插入的地方。而且,Maven也预定义了一些内置的属性,如project.basedir
、project.version
等,它们对应于项目的基础目录和项目版本等信息。
<parent>标签
在Maven的pom.xml
文件中,<parent>
标签用于指定当前项目所继承的父项目的详细信息。通过 <parent>
标签,子项目可以从父项目继承大部分配置,实现项目间的层级关系和共性设置的重用。<parent>
标签的一般结构如下:
<parent>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<!-- 可选属性 -->
<relativePath>...</relativePath>
</parent>
- groupId:父项目的组织ID,标识父项目所属的组织或项目组。
- artifactId:父项目的模块ID,即父项目的唯一标识名称。
- version:父项目的版本号,子项目会继承父项目的版本管理策略。
可选子标签与属性:
- relativePath:(可选)指定父POM文件相对于当前项目POM文件的相对路径。如果不指定或者设为
""
(空字符串),Maven将按照标准的仓库结构在本地仓库中寻找匹配的父项目POM文件。如果指定了有效路径,则Maven会优先在指定的路径下查找。
当子项目继承父项目时,它可以获取并使用父项目中定义的以下内容:
- 构建配置(包括插件和插件管理器的配置)
- 依赖管理(dependencyManagement),虽然不会直接引入依赖,但是可以统一管理依赖的版本
- 属性定义(properties)
- 继承的模块(modules)、组织信息和其他元数据
通过这样的层级结构和继承机制,大型项目可以更方便地组织和维护各个模块的构建和依赖关系,同时也便于集中管理共有的构建和依赖版本策略。
<profiles>标签
在Maven的pom.xml
文件中,<profiles>
标签用于定义项目构建时的不同环境或场景配置。通过创建不同的<profile>
子标签,可以根据不同的条件激活特定的构建配置,从而使项目能够适应多种构建环境,如开发环境、测试环境、生产环境等。
每个<profile>
标签内部可以包含多种Maven构建生命周期阶段相关的配置,包括但不限于:
-
activation 子标签:
- 用于定义何时激活某个Profile,它可以有以下子标签:
<activeByDefault>
:如果设置为true,则在未明确指定其他活动profile时,此profile默认处于激活状态。<jdk>
:根据JDK版本激活profile。<os>
:根据操作系统环境激活profile。<property>
:当指定的Maven属性存在或者其值匹配时激活profile。<file>
:当指定的文件存在时激活profile。
- 用于定义何时激活某个Profile,它可以有以下子标签:
-
build 子标签:
- 包含与构建相关的配置,如资源文件过滤规则、插件配置等。
-
dependencies 子标签:
- 用于声明在该profile下特有的依赖关系,当profile激活时,这些依赖将会添加到项目中。
-
repositories 和 pluginRepositories 子标签:
- 分别用于定义在该profile下使用的额外仓库和插件仓库。
-
distributionManagement 子标签:
- 定义该profile下构件部署的目标位置。
-
properties 子标签:
- 定义该profile下特定的属性值,可以覆盖全局定义的属性。
-
reporting 子标签:
- 定义该profile下定制的报告生成配置。
举例说明:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<database.url>jdbc:dev_database_url</database.url>
</properties>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>dev-tools</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>prod</id>
<activation>
<property>
<name>env</name>
<value>prod</value>
</property>
</activation>
<properties>
<database.url>jdbc:prod_database_url</database.url>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<!-- 生产环境的特定Surefire插件配置 -->
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
在上面的例子中,有两个profile,一个是默认激活的开发环境dev
,另一个是在环境变量env
为prod
时激活的生产环境prod
。每个profile都定义了自己的属性和特定的依赖项,以及针对生产环境的构建插件配置。这样,在不同环境下构建项目时,Maven会根据激活的profile加载相应的配置进行构建。
<repositories>标签
在Maven项目中,<repositories>
标签用于在 pom.xml
文件中配置项目的远程仓库列表。这些远程仓库是 Maven 在构建项目时从其中下载依赖项的位置。如果没有在本地 .m2
目录找到相应的依赖,Maven 将按照配置的顺序,依次查找 <repositories>
中声明的远程仓库。
作用:
- 允许开发者指定额外的、非标准(中央仓库)的远程仓库地址,以便从私有服务器、公司内部仓库或其他第三方仓库获取项目依赖或插件。
- 当需要访问尚未同步至 Maven 中央仓库的构件时,开发者可以自行添加特定的远程仓库。
常用子标签:
<repository>
:这是<repositories>
标签下的主要子标签,每一个<repository>
标签代表一个远程仓库的具体配置。- 必需属性:
id
: 为仓库定义一个唯一标识符,用于在其他地方引用此仓库。
- 常见属性:
name
: 描述仓库的名称。url
: 仓库的实际 URL 地址。layout
: 指定仓库布局类型,通常是default
或maven2
,默认是 Maven 2/3 的布局。snapshots
和releases
子元素:可以进一步配置仓库对于快照版本和正式发布版本的行为,如是否启用、更新策略等。
- 示例:
- 必需属性:
<repository>
<id>my-private-repo</id>
<name>My Private Repository</name>
<url>http://example.com/repo/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
此外,在 <repository>
标签下还可以设置诸如认证信息(用户名、密码或凭据引用)等其他高级配置,但出于安全原因,通常推荐使用 settings.xml 文件来管理敏感信息。