目录
[7 SpringBoot pom.xml解释](#7 SpringBoot pom.xml解释)
[7.1 示例项目](#7.1 示例项目)
[7.2 pom.xml解释](#7.2 pom.xml解释)
[1. 核心原理](#1. 核心原理)
[2. 实际使用场景](#2. 实际使用场景)
[7.3 问题](#7.3 问题)
7 SpringBoot pom.xml解释
7.1 示例项目
创建一个SpringBoot项目(把maven项目改成SpringBoot项目)
java
<?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.qcby</groupId>
<artifactId>SpringBoot824</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.6</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 这个插件,可以将应用打包成一个可执行的jar包;-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
java
package com.qcby.springboot824;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
java
package com.qcby.springboot824.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "Hello World!";
}
}
7.2 pom.xml解释
- parent标签
在上面的pom文件中有一个Parent标签。而在哈米音乐的每一个子模块的pom.xml文件里都有这个标签,比如 hami_protal
java
<?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">
<parent>
<artifactId>hami_parent</artifactId>
<groupId>com.qcby</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hami_portal</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.qcby</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>hami_core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
</dependency>
</dependencies>
</project>
parent 标签在 Maven 中主要用于实现依赖版本管理、配置继承和插件管理的统一化,是构建多模块项目或复用通用配置的核心机制。以下是其关键作用的详细说明:
- 统一版本管理
Spring Boot 的 spring-boot-starter-parent 是最典型的应用场景。它会预先定义大量依赖的版本号,子项目引入后无需再为每个依赖单独指定版本,避免版本冲突。
- 示例:子项目中引入 spring-boot-starter-web 时,版本会自动继承父工程的 2.7.6.RELEASE(无需手动写 )。

具体查看方法:
在pom.xml文件中进入箭头所指的部分(按着Ctrl,在使用鼠标点击,即可进入)

再进

即可看到这里规定了spring-boot-starter-web 的版本号

- 配置继承
父 POM 中的通用配置(如编译插件、资源过滤、编码格式等)会被所有子模块继承,减少重复配置。
示例:父 POM 中定义 配置 Java 编译版本为 1.8,所有子项目会自动沿用该配置。 - 插件管理
父 POM 可通过 统一管理插件的版本和配置,子项目只需声明插件即可自动继承版本,避免插件版本不一致。
示例:父 POM 管理 maven-compiler-plugin 的版本为 3.8.1,子项目引入时无需再指定版本。 - 多模块项目的聚合与拆分
在多模块项目中,parent 作为 "父模块" 可聚合所有子模块的构建流程,同时子模块可通过 parent 复用公共依赖和配置。
示例:一个电商项目分为 order-service、user-service 等子模块,所有子模块都继承自 parent 模块,共享 Spring Boot 版本和通用配置。
简单来说,parent 标签是 Maven 实现 "一处配置,多处复用" 的关键手段,尤其在 Spring Boot 项目中,它能让依赖管理和项目配置变得简洁且统一。 - spring-boot-starter-parent
- 核心作用(不止版本管理)
- 版本管理:继承 spring-boot-dependencies 的版本仲裁能力(最核心)。
- 默认配置:预设了 Maven 编译配置,比如 Java 版本默认是 1.8(2.7.6 不支持 Java 17 及以上)、编码默认是 UTF-8,无需自己写 标签配置。
- 插件管理:管理了 spring-boot-maven-plugin(打包插件)的版本,打包成可执行 JAR 时直接用即可,无需指定插件版本。
- 特殊场景:不继承 Parent 怎么办?
如果项目需要继承公司自己的父项目(前提是这个项目没有继承过spring-boot-dependencies,否则 无需手动配置, Maven 的依赖管理具有传递性,后续的项目会自动继承spring-boot-dependencies),无法继承 spring-boot-starter-parent,可以通过 手动引入 spring-boot-dependencies 来保留版本仲裁能力,代码如下:
java
<dependencyManagement>
<dependencies>
<!-- 手动引入版本仲裁中心,保留 2.7.6 的版本管理能力 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
注:继承关系中,子项目的配置优先级高于父项目,所以即使公司父项目定义了版本,你也可以在自己的项目中修改(遵循 Maven 依赖管理的 "就近原则")。
- spring-boot-dependencies
Spring Boot 项目通常会继承一个父项目,形成如下层级关系(项目里的查看方法见上):
第一层父项目(直接继承)
java
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.6</version>
</parent>
第二层父项目(真正的依赖管理)
java
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.6</version>
</parent>
核心作用:
- spring-boot-dependencies是 Spring Boot 的版本仲裁中心,定义了几乎所有常用依赖的默认版本
- 继承此父项目后,引入大多数依赖时无需指定版本号(自动使用仲裁中心定义的版本)
- 未被仲裁中心管理的依赖(如特殊第三方库)仍需手动指定版本
注:spring-boot-starter-parent 是我们项目直接继承的父项目,而它的父项目是 spring-boot-dependencies。也就是说,spring-boot-starter-parent 本身不管理版本,是通过继承 spring-boot-dependencies 来获得版本仲裁能力的,同时还额外提供了编译配置、插件管理等功能。
- 启动器(Starter)
- 核心原理
Starter 是 Spring Boot 的 "功能套餐",本质是一个 Maven 依赖描述文件。它会把某个功能场景需要的所有依赖(比如 Web 开发需要的 Spring MVC、Tomcat、Jackson 等)打包整合,引入一个 Starter 就等于引入了该场景的所有依赖。 - 2.7.6 常用 Starter 及作用
|------------------------------|-----------------|---------------------------------------|
| Starter 名称 | 功能场景 | 包含的核心依赖(举例) |
| spring-boot-starter-web | Web 开发(接口开发) | Spring MVC、内置 Tomcat、Jackson(JSON 解析) |
| spring-boot-starter-data-jpa | JPA 数据访问(操作数据库) | Spring Data JPA、Hibernate、JDBC 规范 |
| spring-boot-starter-test | 单元测试 | JUnit 5、Mockito(模拟对象)、AssertJ(断言) |
| mybatis-spring-boot-starter | MyBatis 数据访问 | MyBatis 核心、MyBatis 与 Spring 整合包 |
以 Web 场景为例:
java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
核心作用:
- spring-boot-starter是 Spring Boot 的场景启动器,每个启动器对应一个功能场景
- spring-boot-starter-web自动导入 Web 开发所需的所有依赖(如 Spring MVC、Tomcat 等)
- 遵循 "按需导入" 原则,需要什么功能就引入对应的启动器
如果想把spring-boot-starter-web 里内置 Tomcat 换成 Jetty。需要先在 spring-boot-starter-web 里排除 Tomcat 依赖,再引入 Jetty 的 Starter 即可,代码如下:
java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除内置 Tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入 Jetty 启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
- 版本仲裁机制
1. 核心原理
Spring Boot 的版本仲裁核心是 spring-boot-dependencies(父项目的父项目)。它通过 Maven 的 标签,提前定义了 2.7.6 版本配套的所有依赖版本,比如 Spring Framework 5.3.25、MySQL 驱动 8.0.30、MyBatis 2.2.2 等。
2. 实际使用场景
- 无需写版本:只要是 spring-boot-dependencies 里管理过的依赖,比如 spring-boot-starter-web、mybatis-spring-boot-starter,引入时直接写 GAV 的前两项(groupId、artifactId)即可,版本会自动继承 2.7.6 的仲裁版本。
- 覆盖默认版本:如果想改用其他版本(比如把 MySQL 驱动升到 8.0.32,MySQL 驱动不在 spring-boot-starter-web 中,但MySQL 驱动的版本在 spring-boot-dependencies 中管理)。这个有两种方式,区别就是优先级不一样。
- 通过 覆盖(推荐)
直接在自己项目的 标签里重新定义版本号即可,优先级比仲裁中心高。在项目的 中重新定义 mysql.version,会覆盖 spring-boot-dependencies 中预设的版本。此时引入依赖时 无需写 ,Maven 会自动使用你在 中定义的版本。
java
<!-- 1. 在properties中覆盖版本 -->
<properties>
<mysql.version>8.0.32</mysql.version> <!-- 优先级高于仲裁中心 -->
</properties>
<!-- 2. 引入依赖时无需写version -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId> <!-- 自动使用8.0.32 -->
</dependency>
原理:spring-boot-dependencies 中通过 ${mysql.version} 引用版本,而你在项目中重新定义了这个变量,变量值会被覆盖。
- 直接在 中写 (也有效,优先级更高)
如果不在 中定义,而是直接在依赖中手动指定 ,同样可以覆盖默认版本,且优先级比 更高:
java
<!-- 直接指定version,无需properties -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.32</version> <!-- 直接指定,优先级最高 -->
</dependency>
原理:Maven 中,直接在依赖上写的 优先级最高,会忽略 和父项目的版本定义。
- 注:
优先级总结(从高到低) - 直接在 中指定的 (手动写死,优先级最高)
- 项目自身 中定义的版本变量(如 )
- 父项目(spring-boot-dependencies)中定义的版本变量(默认版本)
开发中如何选择? - 推荐用 方式 1( 覆盖):统一管理版本,方便后续升级(改一处即可),符合 Spring Boot 的设计理念。
- 方式 2(直接写 ):适合临时调试或特殊场景,但不利于版本统一管理,不推荐常规使用。
7.3 问题
- 导入依赖时,pom文件报错
导入pom文件时,如果出现这个情况,artifactid都标红了,但是里面内容的拼写无误。此时可能就是因为-是中文状下输入的,因为-在中英文状态下肉眼看不出差别。

修改完后,会显示版本号找不到 ,此时可能是因为本地仓库中没有,写代码写完,会去本地仓库里面找。如果没有就标红。

加载pom文件的时候回去远程仓库找,如果没有就会标红。此时还是标红。先确保拼写无误,无误后还是有问题,就重新打一遍groupid,如果代码是从其他地方复制来的,可能会出现一些不可见字符。如果打groupid还是不行就在打一次artifactId。

成功后的图片如下,Maven 会自动通过父工程 spring-boot-starter-parent 管理子依赖(如 spring-boot-starter-web)的版本,此时 左边会出现版本继承的标识。(2.7.6和2.7.6.RELEASE是完全等价的,二者指向同一个版本的依赖,Maven 会自动识别这种兼容性,这种设计是为了简化配置)

如果此时还是要用2.7.6.RELEASE,会出现下面错误。当你之前配置了错误的 groupId(如 org.springframework.boot 拼写错误),Maven 尝试从中央仓库下载 2.7.6.RELEASE 时失败了。Maven 会将这次 "失败结果" 缓存到本地,默认在 24 小时内不会再重新尝试下载,于是就出现了 "resolution will not be reattempted until the update interval..." 的提示。此时可以强制清除缓存并更新依赖进入项目根目录,执行 mvn clean install -U(-U 表示强制更新)。如果还是不行就手动删除本地仓库中对应依赖的缓存目录。找到本地 Maven 仓库路径(如 C:\Users\你的用户名\.m2\repository\org\springframework\boot\spring-boot-starter-parent)。删除 2.7.6.RELEASE 对应的文件夹,然后重新执行 "强制更新" 操作。

maven各坐标标红的原因
- groupId 或 artifactId
- 拼写错误:groupId/artifactId拼写错误、groupId/artifactId存在不可见字符;artifactId的-是中文状态下输入的
- 依赖坐标与仓库不匹配:确认该依赖是否存在于你配置的 Maven 仓库中(如中央仓库、阿里云镜像等)。可通过 Maven 中央仓库搜索 验证坐标是否有效。
- Maven 配置问题:镜像或仓库配置错误:检查 settings.xml 中的镜像地址是否正确,若使用私有仓库,需确保仓库地址、认证信息无误;本地仓库损坏:删除本地仓库中对应依赖的缓存目录(如 ~/.m2/repository/org/springframework/boot),然后重新刷新项目。
- IDE 缓存问题:在 IDEA 中执行 File → Invalidate Caches / Restart,清除 IDE 缓存后重启,再重新加载 Maven 项目。
- version
- 版本号本身无效:版本号拼写错误、该版本不存在于本地/中央仓库中。
- 依赖坐标 "隐性错误":groupId、artifactId有错。
- 仓库访问 / 缓存问题:镜像配置错误(比如阿里云镜像地址写错),导致 Maven 无法从仓库拉取版本信息;本地仓库缓存损坏,比如之前下载到一半的依赖文件残留,IDE 读取缓存时判定版本 "不可用"。
确定依赖是否存在中央仓库的方法:
打开 Maven Central Repository(中央仓库搜索页)。 https://central.sonatype.com/?smo=true
在搜索框输入依赖坐标,比如 org.springframework.boot:spring-boot-starter-parent。
在搜索结果中确认你使用的版本号(如 2.7.6.RELEASE)是否存在。
直接复制官网提供的依赖代码到 pom.xml,避免手动输入错误。