首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

spring-boot-starter-parent POM与spring-boot-starter POM有什么不同?

目前使用的SpringBoot版本是2.1.4,五年前刚搭建这个项目时使用这个版本,五年后项目维护依旧使用这个版本。时间在变,而我使用的技术还没有变。

每次要看SpringBoot的某个Stater的pom文件时,都需要经过spring-boot-starter:2.1.4.RESEASE.pom这个中间pom。

而项目里的parent是spring-boot-starter-parent,这两个pom文件有什么区别吗?为何要分为两个pom,一个不香吗?

一、spring-boot-starter-parent 的pom文件结构

1. parent 元素

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-dependencies</artifactId>

<version>2.1.4.RELEASE</version>

<relativePath>../../spring-boot-dependencies</relativePath>

parent元素指定当前 POM 文件继承的父 POM 文件信息。

groupId、artifactId、version指定父 POM 文件的坐标信息,即spring-boot-dependencies的版本为2.1.4.RELEASE。

relativePath指定父 POM 文件在当前项目结构中的相对路径,这里是../../spring-boot-dependencies,表示向上两级目录找到spring-boot-dependencies文件。

2. 基本信息

artifactId是当前项目的 Artifact ID,即spring-boot-starter-parent。

packaging指定项目的打包方式,这里是pom,表示它是一个 POM 项目,不生成可执行的 JAR 或 WAR。

name和description分别是项目的名称和描述。

url指向项目主页的 URL。

3. properties 自定义属性

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

<resource.delimiter>@</resource.delimiter>

<maven.compiler.source>${java.version}</maven.compiler.source>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.target>${java.version}</maven.compiler.target>

properties元素定义一系列属性,用于配置项目的不同方面。

java.version定义项目使用的 Java 版本为 1.8。

其他属性如编码、资源分隔符等提供更多的配置选项。

4. build 构建元素

<resources>

<!-- 资源文件配置 -->

</resources>

<pluginManagement>

<!-- 插件配置 -->

</pluginManagement>

build元素包含项目的构建配置。

resources指定项目中需要处理的资源文件,包括对特定文件类型的过滤处理,详细配置在下方的resources元素中。

pluginManagement部分预留对插件的管理配置,详细配置在下方的pluginManagement元素中。

5. resources 构建里的资源文件处理

<resource>

<filtering>true</filtering>

<directory>${basedir}/src/main/resources</directory>

<includes>

<include>**/application*.yml</include>

<include>**/application*.yaml</include>

<include>**/application*.properties</include>

</includes>

</resource>

<resource>

<directory>${basedir}/src/main/resources</directory>

<excludes>

<exclude>**/application*.yml</exclude>

<exclude>**/application*.yaml</exclude>

<exclude>**/application*.properties</exclude>

</excludes>

</resource>

resources指定项目中需要处理的资源文件,包括对特定文件类型的过滤处理。

resource一个资源的管理,可以包含多个。

filtering是否启用资源过滤,默认false,这里为true,需要过滤资源。

directory资源文件的路径。

includes指定哪些文件应该被包括在内。

excludes指定哪些文件应该被排除在外。

看完这段配置,有没有觉得这段配置有点矛盾,其实没有。

第一个 <resource> 元素:

开启资源过滤 (<filtering>true</filtering>)。

指定资源目录为项目的 src/main/resources。

仅包括以 application 开头的 .yml、.yaml 和 .properties 文件。

这意味着,所有匹配的文件将被处理,Maven会在复制这些文件到输出目录时替换文件中的占位符。

第二个 <resource> 元素:

指定同样的资源目录。

排除以 application 开头的 .yml、.yaml 和 .properties 文件。

这意味着,除上述指定的文件外,其他所有文件都会被简单地复制到输出目录,而不进行任何过滤处理。

这种配置的目的是将资源文件分为两类处理:

配置文件(如application.yml等)需要进行过滤处理,以便在构建过程中插入正确的配置值。

非配置文件(即不是以application开头的文件)则不需要过滤,直接复制即可。

6. pluginManagement 构建里的插件

<plugins>

<!-- 插件配置 -->

</plugins>

pluginManagement元素用于管理插件的版本和配置。

包含多个插件的配置,如 Kotlin 编译插件、Maven 编译插件、Spring Boot 插件等。

每个插件配置版本、执行阶段、目标等信息,确保在构建过程中插件能够正确执行任务。

二、spring-boot-starter的pom文件结构

1. 基本信息

artifactId是当前项目的 Artifact ID,即spring-boot-dependencies。

version是当前项目的 version,即2.1.4.RELEASE。

packaging指定了项目的打包方式,这里是pom,表示它是一个 POM 项目,不生成可执行的 JAR 或 WAR。

name和description分别是项目的名称和描述。

url指向项目主页的 URL。

2. licenses 许可证信息

licenses当前项目的许可证信息,可以包含多个license。

license具体的一个许可证信息。

name许可证的名称,即Apache License, Version 2.0。

url指向许可证主页的 URL。

3. developers开发者信息

developers当前项目的开发者信息,可以包含多个developer。

developer具体的一个开发者。

name开发者名称。

email开发者邮箱。

organization开发者所在组织。

organizationUrl指向 开发者所在组织的 URL。

4. scm版本控制

scm元素用于管理版本控制相关的信息。

url指向版本控制主页的 URL。

5.properties自定义属性

<activemq.version>5.15.9</activemq.version>

<antlr2.version>2.7.7</antlr2.version>

<appengine-sdk.version>1.9.73</appengine-sdk.version>

<artemis.version>2.6.4</artemis.version>

<aspectj.version>1.9.2</aspectj.version>

//...

properties元素用于自定义属性,包括依赖、插件的版本管理。

184个版本信息,把依赖、插件的版本信息集中到这里进行管理。

6.dependencyManagement依赖管理

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot</artifactId>

<version>2.1.4.RELEASE</version>

</dependency>

//...spring-boot 和 spring-boot-starter相关依赖

<dependency>

<groupId>xml-apis</groupId>

<artifactId>xml-apis</artifactId>

<version>${xml-apis.version}</version>

</dependency>

//...第三方相关依赖

</dependencies>

dependencyManagement元素用于管理依赖的版本和配置。

包含12个spring-boot-xxx相关依赖,53个spring-boot-starter-xxx和824个第三方的相关依赖。

每个依赖配置了版本、执行阶段等信息,确保在构建过程中插件能够正确执行任务。

依赖太多,上千个依赖,三千多行,看不完根本看不完。

7.插件管理

<pluginManagement>

<plugins>

<plugin>

<groupId>org.apache.johnzon</groupId>

<artifactId>johnzon-maven-plugin</artifactId>

<version>${johnzon.version}</version>

</plugin>

//...其他插件

</plugins>

</pluginManagement>

pluginManagement元素用于管理插件的版本和配置。插件管理放在 build 构建元素里。

包含31个插件的配置。

每个插件配置了版本、执行阶段、目标等信息,确保在构建过程中插件能够正确执行任务。

三、最后总结

从以上两个pom文件的关系可以看出,spring-boot-dependencies POM是 spring-boot-starter-parent POM 的parent 父类,spring-boot-starter-parent POM继承了spring-boot-dependencies POM, 在项目里使用 spring-boot-starter-parent 作为 parent 可以正常使用 spring-boot-dependencies POM中管理的依赖和插件。

spring-boot-dependencies POM 列出了所有Spring Boot推荐的依赖项、插件及其版本。这意味着它不实际引入这些依赖项和插件到项目中,而是提供一个依赖版本、插件版本的管理列表,确保应用中的所有Spring Boot依赖都使用兼容版本。

spring-boot-starter-parent POM 继承了spring-boot-dependencies的POM,不仅仅包括了依赖管理,还预设了许多Maven的构建和插件配置,如资源过滤、插件配置等,这些都是为了优化Spring Boot应用的构建过程。

spring-boot-dependencies提供了一种管理依赖版本的方法,而spring-boot-starter-parent提供了一个完整的构建和配置环境,两者共同简化了Spring Boot应用的开发和管理。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OCLsezQ8zDOjMhQuUkWG9nyg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券