目前使用的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应用的开发和管理。
领取专属 10元无门槛券
私享最新 技术干货