7 SpringBoot pom.xml解释

目录

[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 问题)

maven各坐标标红的原因

确定依赖是否存在中央仓库的方法:


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解释

  1. 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 中主要用于实现依赖版本管理、配置继承和插件管理的统一化,是构建多模块项目或复用通用配置的核心机制。以下是其关键作用的详细说明:

  1. 统一版本管理
    Spring Boot 的 spring-boot-starter-parent 是最典型的应用场景。它会预先定义大量依赖的版本号,子项目引入后无需再为每个依赖单独指定版本,避免版本冲突。
  • 示例:子项目中引入 spring-boot-starter-web 时,版本会自动继承父工程的 2.7.6.RELEASE(无需手动写 )。

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

    再进

    即可看到这里规定了spring-boot-starter-web 的版本号
  1. 配置继承
    父 POM 中的通用配置(如编译插件、资源过滤、编码格式等)会被所有子模块继承,减少重复配置。
    示例:父 POM 中定义 配置 Java 编译版本为 1.8,所有子项目会自动沿用该配置。
  2. 插件管理
    父 POM 可通过 统一管理插件的版本和配置,子项目只需声明插件即可自动继承版本,避免插件版本不一致。
    示例:父 POM 管理 maven-compiler-plugin 的版本为 3.8.1,子项目引入时无需再指定版本。
  3. 多模块项目的聚合与拆分
    在多模块项目中,parent 作为 "父模块" 可聚合所有子模块的构建流程,同时子模块可通过 parent 复用公共依赖和配置。
    示例:一个电商项目分为 order-service、user-service 等子模块,所有子模块都继承自 parent 模块,共享 Spring Boot 版本和通用配置。
    简单来说,parent 标签是 Maven 实现 "一处配置,多处复用" 的关键手段,尤其在 Spring Boot 项目中,它能让依赖管理和项目配置变得简洁且统一。
  4. spring-boot-starter-parent
  5. 核心作用(不止版本管理)
  • 版本管理:继承 spring-boot-dependencies 的版本仲裁能力(最核心)。
  • 默认配置:预设了 Maven 编译配置,比如 Java 版本默认是 1.8(2.7.6 不支持 Java 17 及以上)、编码默认是 UTF-8,无需自己写 标签配置。
  • 插件管理:管理了 spring-boot-maven-plugin(打包插件)的版本,打包成可执行 JAR 时直接用即可,无需指定插件版本。
  1. 特殊场景:不继承 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 依赖管理的 "就近原则")。

  1. 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 来获得版本仲裁能力的,同时还额外提供了编译配置、插件管理等功能。
  1. 启动器(Starter)
  2. 核心原理
    Starter 是 Spring Boot 的 "功能套餐",本质是一个 Maven 依赖描述文件。它会把某个功能场景需要的所有依赖(比如 Web 开发需要的 Spring MVC、Tomcat、Jackson 等)打包整合,引入一个 Starter 就等于引入了该场景的所有依赖。
  3. 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. 版本仲裁机制
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 中管理)。这个有两种方式,区别就是优先级不一样。
  1. 通过 覆盖(推荐)
    直接在自己项目的 标签里重新定义版本号即可,优先级比仲裁中心高。在项目的 中重新定义 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} 引用版本,而你在项目中重新定义了这个变量,变量值会被覆盖。

  1. 直接在 中写 (也有效,优先级更高)
    如果不在 中定义,而是直接在依赖中手动指定 ,同样可以覆盖默认版本,且优先级比 更高:
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 问题

  1. 导入依赖时,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各坐标标红的原因
  1. groupId 或 artifactId
  2. 拼写错误:groupId/artifactId拼写错误、groupId/artifactId存在不可见字符;artifactId的-是中文状态下输入的
  3. 依赖坐标与仓库不匹配:确认该依赖是否存在于你配置的 Maven 仓库中(如中央仓库、阿里云镜像等)。可通过 Maven 中央仓库搜索 验证坐标是否有效。
  4. Maven 配置问题:镜像或仓库配置错误:检查 settings.xml 中的镜像地址是否正确,若使用私有仓库,需确保仓库地址、认证信息无误;本地仓库损坏:删除本地仓库中对应依赖的缓存目录(如 ~/.m2/repository/org/springframework/boot),然后重新刷新项目。
  5. IDE 缓存问题:在 IDEA 中执行 File → Invalidate Caches / Restart,清除 IDE 缓存后重启,再重新加载 Maven 项目。
  6. version
  7. 版本号本身无效:版本号拼写错误、该版本不存在于本地/中央仓库中。
  8. 依赖坐标 "隐性错误":groupId、artifactId有错。
  9. 仓库访问 / 缓存问题:镜像配置错误(比如阿里云镜像地址写错),导致 Maven 无法从仓库拉取版本信息;本地仓库缓存损坏,比如之前下载到一半的依赖文件残留,IDE 读取缓存时判定版本 "不可用"。
确定依赖是否存在中央仓库的方法:

打开 Maven Central Repository(中央仓库搜索页)。 https://central.sonatype.com/?smo=true
在搜索框输入依赖坐标,比如 org.springframework.boot:spring-boot-starter-parent。
在搜索结果中确认你使用的版本号(如 2.7.6.RELEASE)是否存在。
直接复制官网提供的依赖代码到 pom.xml,避免手动输入错误。

相关推荐
老鼠只爱大米1 小时前
Java设计模式之装饰器模式详解
java·设计模式·装饰器模式·decorator·java设计模式
i***l9201 小时前
使用 Spring Boot 实现图片上传
spring boot·后端·状态模式
0***v7771 小时前
springboot 异步操作
java·spring boot·mybatis
ps酷教程1 小时前
java泛型反射&mybatis的TypeParameterResolver
java·mybatis
b***59431 小时前
springboot+mybaties项目中扫描不到@mapper注解的解决方法
java·spring boot·mybatis
i***17181 小时前
SpringBoot Maven 项目 pom 中的 plugin 插件用法整理
spring boot·后端·maven
u***42071 小时前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
慕沐.1 小时前
【算法】冒泡排序的原理及实现
java·算法·排序算法
9***44631 小时前
Spring 核心技术解析【纯干货版】- Ⅶ:Spring 切面编程模块 Spring-Instrument 模块精讲
前端·数据库·spring