一、什么是 pom.xml?
POM = Project Object Model(项目对象模型)
Maven 项目的核心配置文件
描述项目的各种信息:依赖、构建配置、插件等
类似于前端项目的 package.json
二、pom.xml 的基本结构
xml
<?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/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 用坐标唯一标识一个项目:
xml
<groupId>org.example</groupId> <!-- 组织/公司域名倒序 -->
<artifactId>demo_06</artifactId> <!-- 项目名称 -->
<version>1.0-SNAPSHOT</version> <!-- 版本号 -->
版本号说明:
SNAPSHOT:开发版本,不稳定
RELEASE:正式版本
数字版本:如 1.0.0、2.1.3
完整坐标示例:
text
org.springframework.boot:spring-boot-starter-web:3.2.3
└─────groupId──────┘└────artifactId────┘└─version─┘
3.2 父项目(parent)
继承另一个项目的配置,避免重复配置:
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.3</version>
<relativePath/> <!-- 从中央仓库查找,而不是本地 -->
</parent>
作用:
继承依赖版本管理(不用写版本号)
继承插件配置
继承 Java 版本设置
为什么需要 parent?
xml
<!-- 有 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)
定义可复用的变量:
xml
<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>
使用属性:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.version}</version> <!-- 引用属性 -->
</dependency>
3.4 依赖管理(dependencies)
这是最重要的部分,声明项目需要哪些外部库:
xml
<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)
配置编译、打包等构建过程:
xml
<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)
配置依赖下载源:
xml
<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 会引入多个依赖:
xml
<!-- spring-boot-starter-web 实际引入 -->
- spring-boot-starter
- spring-web
- spring-webmvc
- tomcat-embed-core
- jackson-databind
- ...
五、常用 Maven 命令
bash
# 清理编译文件
mvn clean
# 编译项目
mvn compile
# 运行测试
mvn test
# 打包(生成 jar/war)
mvn package
# 安装到本地仓库
mvn install
# 强制更新依赖
mvn clean install -U
# 查看依赖树
mvn dependency:tree
六、最佳实践
6.1 始终使用 parent 管理版本
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.3</version>
</parent>
6.2 统一管理版本号
xml
<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
xml
<!-- 数据库驱动:运行时需要 -->
<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
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
<?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/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 避免重复配置