赞
踩
目前使用的SpringBoot版本是2.1.4,五年前刚搭建这个项目时使用这个版本,五年后项目维护依旧使用这个版本。时间在变,而我使用的技术还没有变。
每次要看SpringBoot的某个Stater的pom文件时,都需要经过spring-boot-starter:2.1.4.RESEASE.pom这个中间pom。
而项目里的parent是spring-boot-starter-parent,这两个pom文件有什么区别吗?为何要分为两个pom,一个不香吗?
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 文件信息。
groupId
、artifactId
、version
指定父 POM 文件的坐标信息,即 spring-boot-dependencies
的版本为 2.1.4.RELEASE
。
relativePath
指定父 POM 文件在当前项目结构中的相对路径,这里是 ../../spring-boot-dependencies
,表示向上两级目录找到 spring-boot-dependencies
文件。
- <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。
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。
其他属性如编码、资源分隔符等提供更多的配置选项。
build
构建元素- <build>
- <resources>
- <!-- 资源文件配置 -->
- </resources>
- <pluginManagement>
- <!-- 插件配置 -->
- </pluginManagement>
- </build>
build
元素包含项目的构建配置。
resources
指定项目中需要处理的资源文件,包括对特定文件类型的过滤处理,详细配置在下方的 resources
元素中。
pluginManagement
部分预留对插件的管理配置,详细配置在下方的 pluginManagement
元素中。
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开头的文件)则不需要过滤,直接复制即可。
pluginManagement
构建里的插件- <pluginManagement>
- <plugins>
- <!-- 插件配置 -->
- </plugins>
- </pluginManagement>
pluginManagement
元素用于管理插件的版本和配置。
包含多个插件的配置,如 Kotlin 编译插件、Maven 编译插件、Spring Boot 插件等。
每个插件配置版本、执行阶段、目标等信息,确保在构建过程中插件能够正确执行任务。
- <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。
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。
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。
scm
版本控制- <scm>
- <url>https://github.com/spring-projects/spring-boot</url>
- </scm>
scm
元素用于管理版本控制相关的信息。
url
指向版本控制主页的 URL。
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个版本信息,把依赖、插件的版本信息集中到这里进行管理。
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个第三方的相关依赖。
每个依赖配置了版本、执行阶段等信息,确保在构建过程中插件能够正确执行任务。
依赖太多,上千个依赖,三千多行,看不完根本看不完。
- <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应用的开发和管理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。