当前位置:   article > 正文

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

spring-boot-starter-parent 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 元素

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

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

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

2. 基本信息

  1. <artifactId>spring-boot-starter-parent</artifactId>
  2. <packaging>pom</packaging>
  3. <name>Spring Boot Starter Parent</name>
  4. <description>Parent pom providing dependency and plugin management for applications built with Maven</description>
  5. <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 自定义属性

  1. <properties>
  2. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  3. <java.version>1.8</java.version>
  4. <resource.delimiter>@</resource.delimiter>
  5. <maven.compiler.source>${java.version}</maven.compiler.source>
  6. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  7. <maven.compiler.target>${java.version}</maven.compiler.target>
  8. </properties>
  • properties 元素定义一系列属性,用于配置项目的不同方面。

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

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

4. build 构建元素

  1. <build>
  2. <resources>
  3. <!-- 资源文件配置 -->
  4. </resources>
  5. <pluginManagement>
  6. <!-- 插件配置 -->
  7. </pluginManagement>
  8. </build>
  • build 元素包含项目的构建配置。

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

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

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

  1. <resources>
  2. <resource>
  3. <filtering>true</filtering>
  4. <directory>${basedir}/src/main/resources</directory>
  5. <includes>
  6. <include>**/application*.yml</include>
  7. <include>**/application*.yaml</include>
  8. <include>**/application*.properties</include>
  9. </includes>
  10. </resource>
  11. <resource>
  12. <directory>${basedir}/src/main/resources</directory>
  13. <excludes>
  14. <exclude>**/application*.yml</exclude>
  15. <exclude>**/application*.yaml</exclude>
  16. <exclude>**/application*.properties</exclude>
  17. </excludes>
  18. </resource>
  19. </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 构建里的插件

  1. <pluginManagement>
  2. <plugins>
  3. <!-- 插件配置 -->
  4. </plugins>
  5. </pluginManagement>
  • pluginManagement 元素用于管理插件的版本和配置。

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

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

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

1. 基本信息

  1. <groupId>org.springframework.boot</groupId>
  2. <artifactId>spring-boot-dependencies</artifactId>
  3. <version>2.1.4.RELEASE</version>
  4. <packaging>pom</packaging>
  5. <name>Spring Boot Dependencies</name>
  6. <description>Spring Boot Dependencies</description>
  7. <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 许可证信息

  1. <licenses>
  2. <license>
  3. <name>Apache License, Version 2.0</name>
  4. <url>https://www.apache.org/licenses/LICENSE-2.0</url>
  5. </license>
  6. </licenses>
  • licenses 当前项目的许可证信息,可以包含多个license。

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

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

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

3. developers开发者信息

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

  • developer 具体的一个开发者。

  • name 开发者名称。

  • email 开发者邮箱。

  • organization 开发者所在组织。

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

4. scm版本控制

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

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

5.properties自定义属性

  1. <properties>
  2. <activemq.version>5.15.9</activemq.version>
  3. <antlr2.version>2.7.7</antlr2.version>
  4. <appengine-sdk.version>1.9.73</appengine-sdk.version>
  5. <artemis.version>2.6.4</artemis.version>
  6. <aspectj.version>1.9.2</aspectj.version>
  7. //...
  8. </properties>
  • properties 元素用于自定义属性,包括依赖、插件的版本管理。
    184个版本信息,把依赖、插件的版本信息集中到这里进行管理。

6.dependencyManagement依赖管理

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot</artifactId>
  6. <version>2.1.4.RELEASE</version>
  7. </dependency>
  8. //...spring-boot 和 spring-boot-starter相关依赖
  9. <dependency>
  10. <groupId>xml-apis</groupId>
  11. <artifactId>xml-apis</artifactId>
  12. <version>${xml-apis.version}</version>
  13. </dependency>
  14. //...第三方相关依赖
  15. </dependencies>
  16. </dependencyManagement>
  • dependencyManagement 元素用于管理依赖的版本和配置。

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

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

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

7.插件管理

  1. <build>
  2. <pluginManagement>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.apache.johnzon</groupId>
  6. <artifactId>johnzon-maven-plugin</artifactId>
  7. <version>${johnzon.version}</version>
  8. </plugin>
  9. //...其他插件
  10. </plugins>
  11. </pluginManagement>
  12. </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应用的开发和管理。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/1019278
推荐阅读
相关标签
  

闽ICP备14008679号