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

50 篇文章 0 订阅
12 篇文章 0 订阅

概叙

        目前使用的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 元素

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>
  • parent 元素指定当前 POM 文件继承的父 POM 文件信息。

  • groupIdartifactIdversion 指定父 POM 文件的坐标信息,即 spring-boot-dependencies 的版本为 2.1.4.RELEASE

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

2. 基本信息

<artifactId>spring-boot-starter-parent</artifactId>
<packaging>pom</packaging>
<name>Spring Boot Starter Parent</name>
<description>Parent pom providing dependency and plugin management for applications  built with Maven</description>
<url>https://projects.spring.io/spring-boot/#/spring-boot-starter-parent</url>
  • artifactId 是当前项目的 Artifact ID,即 spring-boot-starter-parent

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

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

  • url 指向项目主页的 URL。

3. properties 自定义属性

<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>
  • properties 元素定义一系列属性,用于配置项目的不同方面。

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

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

4. build 构建元素

<build>
    <resources>
       <!-- 资源文件配置 -->
    </resources>
    <pluginManagement>
        <!-- 插件配置 -->
    </pluginManagement>
</build>
  • build 元素包含项目的构建配置。

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

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

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

<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>
  • 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 构建里的插件

<pluginManagement>
    <plugins>
        <!-- 插件配置 -->
    </plugins>
</pluginManagement>
  • pluginManagement 元素用于管理插件的版本和配置。

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

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

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

1. 基本信息

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<packaging>pom</packaging>
<name>Spring Boot Dependencies</name>
<description>Spring Boot Dependencies</description>
<url>https://projects.spring.io/spring-boot/#</url>
  • groupId 是当前项目的 Group ID,即 org.springframework.boot

  • 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>
    <name>Apache License, Version 2.0</name>
    <url>https://www.apache.org/licenses/LICENSE-2.0</url>
    </license>
</licenses>
  • licenses 当前项目的许可证信息,可以包含多个license。

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

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

  • url 指向许可证主页的 URL。

3. developers开发者信息

<developers>
    <developer>
    <name>Pivotal</name>
    <email>info@pivotal.io</email>
    <organization>Pivotal Software, Inc.</organization>
    <organizationUrl>https://www.spring.io</organizationUrl>
    </developer>
</developers>
  • developers 当前项目的开发者信息,可以包含多个developer。

  • developer 具体的一个开发者。

  • name 开发者名称。

  • email 开发者邮箱。

  • organization 开发者所在组织。

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

4. scm版本控制

<scm>
    <url>https://github.com/spring-projects/spring-boot</url>
</scm>
  • scm 元素用于管理版本控制相关的信息。

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

5.properties自定义属性

<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>
  • properties 元素用于自定义属性,包括依赖、插件的版本管理。
    184个版本信息,把依赖、插件的版本信息集中到这里进行管理。

6.dependencyManagement依赖管理

<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>
  • dependencyManagement 元素用于管理依赖的版本和配置。

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

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

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

7.插件管理

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.johnzon</groupId>
                <artifactId>johnzon-maven-plugin</artifactId>
                <version>${johnzon.version}</version>
            </plugin>
            //...其他插件
        </plugins>
       </pluginManagement>
</build>
  • 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应用的开发和管理。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-无-为-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值