Maven 的 pom.xml 是项目的“声明式契约”,核心在于结构骨架与依赖血脉;项目坐标(GAV)唯一标识身份,依赖管理通过树状解析与路径最近优先裁决冲突,packaging 决定产出形态,父 POM 与属性实现配置复用。

Maven 的 pom.xml 不是配置清单,而是项目的“声明式契约”——它不告诉你怎么做,而是明确告诉 Maven “你是谁、你要用什么、你最终要变成什么”。理解它,关键在于抓住两个锚点:结构是骨架,依赖管理是血脉。
项目坐标(GAV)是唯一身份标识
每个 Maven 项目必须有且仅有一组 groupId:artifactId:version,就像身份证号一样不可重复。其中:
-
groupId 代表组织归属,通常用反向域名(如
com.example),决定依赖在仓库中的路径层级 -
artifactId 是项目自身名称(如
user-service),在同一 groupId 下必须唯一 -
version 区分稳定性:
1.0.0-SNAPSHOT表示开发中版本,Maven 会定期检查更新;1.0.0或2.3.1.RELEASE是锁定的正式版,发布后不可修改
依赖管理不是简单罗列,而是树状解析与冲突裁决
你在 <dependencies> 里写的每个 <dependency>,Maven 都会递归拉取其所有传递依赖,最终形成一棵依赖树。但不同库可能引入同一类库的不同版本,这时就触发依赖调解机制:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Maven 默认采用路径最近优先原则:离当前 pom 路径越短的版本胜出
- 可通过
<exclusions>主动剔除不需要的传递依赖,避免冲突或冗余 - 用
<dependencyManagement>在父 POM 中统一声明版本,子模块引用时可省略<version>,确保全项目版本一致
packaging 和 build 定义了项目“长成什么样”
<packaging> 默认是 jar,但也可能是 war、pom(多模块父工程)或 bundle(OSGi)。它直接绑定到 Maven 生命周期:
立即学习“Java免费学习笔记(深入)”;
-
jar触发compile → test → package,输出 .jar 文件 -
war会在package阶段把资源、类、依赖打成 .war,并自动适配 Servlet 容器结构 -
<build>中的<plugins>(如maven-compiler-plugin)负责具体执行动作,比如指定 Java 17 编译源码
父 POM 与属性复用让大型项目保持一致性
多模块项目常通过继承实现配置下沉:
-
<parent>标签指向一个父 POM,子模块自动继承其<properties>、<dependencyManagement>和插件配置 -
<properties>可定义变量(如<spring-boot.version>3.2.0</spring-boot.version>),在依赖或插件中用${spring-boot.version}引用,改一处全局生效 - Spring Boot 项目普遍继承
spring-boot-starter-parent,就是靠这种方式统一管理 Starter 版本和编译参数

















