一、什么是 pom.xml?
POM = Project Object Model(项目对象模型)
Maven 项目的核心配置文件 描述项目的各种信息:依赖、构建配置、插件等 类似于前端项目的 package.json二、pom.xml 的基本结构
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="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/xsd/maven-4.0.0.xsd"><!-- 1. 项目基本信息 --><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>demo_06</artifactId><version>1.0-SNAPSHOT</version><!-- 2. 父项目 --><parent>...</parent><!-- 3. 项目属性 --><properties>...</properties><!-- 4. 依赖管理 --><dependencies>...</dependencies><!-- 5. 构建配置 --><build>...</build><!-- 6. 仓库配置 --><repositories>...</repositories></project>三、核心元素详解
3.1 项目坐标(GAV)
Maven 用坐标唯一标识一个项目:
<groupId>org.example</groupId><!-- 组织/公司域名倒序 --><artifactId>demo_06</artifactId><!-- 项目名称 --><version>1.0-SNAPSHOT</version><!-- 版本号 -->版本号说明:
SNAPSHOT:开发版本,不稳定 RELEASE:正式版本 数字版本:如 1.0.0、2.1.3完整坐标示例:
org.springframework.boot:spring-boot-starter-web:3.2.3 └─────groupId──────┘└────artifactId────┘└─version─┘3.2 父项目(parent)
继承另一个项目的配置,避免重复配置:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.3</version><relativePath/><!-- 从中央仓库查找,而不是本地 --></parent>作用:
继承依赖版本管理(不用写版本号) 继承插件配置 继承 Java 版本设置为什么需要 parent?
<!-- 有 parent:不需要指定版本 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 版本由 parent 管理 --></dependency><!-- 无 parent:必须指定版本 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.2.3</version><!-- 必须写 --></dependency>3.3 属性配置(properties)
定义可复用的变量:
<properties><!-- Java 编译版本 --><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><!-- 项目编码 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- 自定义属性 --><spring.version>3.2.3</spring.version><mybatis.version>3.5.6</mybatis.version></properties>使用属性:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring.version}</version><!-- 引用属性 --></dependency>3.4 依赖管理(dependencies)
这是最重要的部分,声明项目需要哪些外部库:
<dependencies><!-- 每个 dependency 代表一个依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 版本由 parent 管理,可选 --></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version><scope>runtime</scope><!-- 作用范围 --></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope><!-- 编译时需要,运行时由容器提供 --></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope><!-- 只在测试时使用 --></dependency></dependencies>依赖范围(scope)详解:
依赖范围对照表
| scope | 编译 | 测试 | 运行 | 说明 |
|---|---|---|---|---|
| compile | ✅ | ✅ | ✅ | 默认范围,所有阶段都需要 |
| provided | ✅ | ✅ | ❌ | 运行时由容器提供(如 servlet-api) |
| runtime | ❌ | ✅ | ✅ | 运行时需要,编译不需要 |
| test | ❌ | ✅ | ❌ | 仅测试时需要(如 JUnit) |
| system | ✅ | ✅ | ❌ | 从本地系统路径加载(不推荐) |
3.5 构建配置(build)
配置编译、打包等构建过程:
<build><!-- 最终打包的文件名 --><finalName>myapp</finalName><!-- 插件配置 --><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>org.example.Main</mainClass><!-- 指定启动类 --></configuration></plugin><!-- 编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.11.0</version><configuration><source>21</source><target>21</target></configuration></plugin></plugins></build>3.6 仓库配置(repositories)
配置依赖下载源:
<repositories><repository><id>aliyun</id><name>Aliyun Maven Repository</name><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled><!-- 不下载快照版本 --></snapshots></repository></repositories>四、Spring Boot Starter 说明
Spring Boot 提供了一系列 “starter” 依赖,自动引入相关依赖:
以下是整理后的表格格式:
| Starter | 作用 |
|---|---|
| spring-boot-starter-web | Web 开发(包含 Spring MVC、Tomcat) |
| spring-boot-starter-data-jpa | 数据库操作(JPA) |
| spring-boot-starter-test | 测试框架 |
| spring-boot-starter-security | 安全框架 |
| spring-boot-starter-redis | Redis 缓存 |
| spring-boot-starter-thymeleaf | 模板引擎 |
一个 starter 会引入多个依赖:
<!-- spring-boot-starter-web 实际引入 -->- spring-boot-starter - spring-web - spring-webmvc - tomcat-embed-core - jackson-databind - ...五、常用 Maven 命令
# 清理编译文件mvn clean# 编译项目mvn compile# 运行测试mvntest# 打包(生成 jar/war)mvn package# 安装到本地仓库mvninstall# 强制更新依赖mvn cleaninstall-U# 查看依赖树mvn dependency:tree六、最佳实践
6.1 始终使用 parent 管理版本
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.3</version></parent>6.2 统一管理版本号
<properties><java.version>17</java.version><mybatis.version>3.5.6</mybatis.version></properties><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency>6.3 合理使用 scope
<!-- 数据库驱动:运行时需要 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- Lombok:编译时需要 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency>6.4 排除传递依赖
xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency>七、完整示例
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!-- 项目坐标 --><groupId>com.example</groupId><artifactId>myproject</artifactId><version>1.0.0</version><packaging>jar</packaging><name>My Spring Boot Project</name><description>Demo project for Spring Boot</description><!-- 父项目 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.3</version></parent><!-- 属性配置 --><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!-- 依赖管理 --><dependencies><!-- Web 开发 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 数据库 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version><scope>runtime</scope></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!-- 构建配置 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>总结
pom.xml 的核心作用:
定义项目身份:groupId、artifactId、version 管理依赖:告诉 Maven 需要哪些第三方库 配置构建:编译、测试、打包等过程的配置 继承公共配置:通过 parent 避免重复配置