SpringBoot系列(三)——Springboot项目中的spring-boot-starter-parent,spring-boot-dependencies依赖关系

东门清夷
2023-12-01

目录

1、项目pom文件依赖,父级项目spring-boot-starter-parent

2、再看spring-boot-starter-parent

3、spring-boot-dependencies-2.2.2.RELEASE.pom

4、总结


使用简单的Springboot生成项目很简单,简单归简单,那他究竟默认都帮我们引入了哪些包。pom文件的依赖关系又是怎样的。

让我们一探究竟。

 

1、项目pom文件依赖,父级项目spring-boot-starter-parent

以一个简单的springboot工程来查看其pom文件,可以看出父级项目是spring-boot-starter-parent

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!--父级项目 与聚合module方便把几个项目合在一起不同 父级项目是为了减少差异-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

2、再看spring-boot-starter-parent


点击进spring-boot-starter-parent再看其pom文件,spring-boot-starter-parent-2.2.2.RELEASE.pom ,注释说明了该文件的一些注意点。

<?xml version="1.0" encoding="utf-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.2.2.RELEASE</version>
    <!-- 定义查找顺序,先从relativePath元素地址值查找,再到本地查找,再到远程仓库查找 -->
    <relativePath>../../spring-boot-dependencies</relativePath>
  </parent>
  <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>

  <properties>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>

    <!-- @会获取其他配置文件 以@开头的值 填充到application.properties中-->
    <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>

  <!-- resource 可以使用变量  ${}则可以引入,与resource.delimiter对应 
        filtering为true的将会对对应的资源文件使用属性替换,将application*.properties${}的地方通过@前缀修饰的值进行替换
   -->
  <build>
    <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>

    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.jetbrains.kotlin</groupId>
          <artifactId>kotlin-maven-plugin</artifactId>
          <version>${kotlin.version}</version>
        </plugin>
    
      </plugins>
    </pluginManagement>
  </build>
</project>

3、spring-boot-dependencies-2.2.2.RELEASE.pom

根据spring-boot-starter-parent-2.2.2.RELEASE.pom 的父级项目spring-boot-dependencies再继续分析,下面的文件省去原有大量的properties和dependency

<?xml version="1.0" encoding="utf-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-dependencies</artifactId>
  <version>2.2.2.RELEASE</version>
  <packaging>pom</packaging>
  <name>Spring Boot Dependencies</name>
  <description>Spring Boot Dependencies</description>
  <url>https://projects.spring.io/spring-boot/#</url>
  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>https://www.apache.org/licenses/LICENSE-2.0</url>
    </license>
  </licenses>
  <developers>
    <developer>
      <name>Pivotal</name>
      <email>info@pivotal.io</email>
      <organization>Pivotal Software, Inc.</organization>
      <organizationUrl>https://www.spring.io</organizationUrl>
    </developer>
  </developers>
  <scm>
    <url>https://github.com/spring-projects/spring-boot</url>
  </scm>

  <!-- 常量定义区 在pom文件中可以直接引用 版本编码等--> 
  <properties>
    <activemq.version>5.15.11</activemq.version>
    <!----> 
  </properties>


 <!-- 管理依赖版本号 与dependency不同的是,dependency是子项目直接包含的依赖,而对于继承的所有子类项目,dependencyManagement可以加固和集中管理
     特别是我们有一系列的工程的时候,我们具体声明了版本号和scope在父类项目中后,对于子类项目有统一的管理,而不需要在每个子模块都声明版本号
  --> 
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot</artifactId>
        <version>2.2.2.RELEASE</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <build>
    <!-- plugin,maven本身其实就是一个插件执行框架,每个任务包括编译等的执行其实都是通过插件执行的,pluginManagement和plugin的关系
       dependencyManagement和dependency的关系类似
    -->
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.johnzon</groupId>
          <artifactId>johnzon-maven-plugin</artifactId>
          <version>${johnzon.version}</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

4、总结

总结一下,继承 spring-boot-starter-parent 来作为父项目, spring-boot-starter-parent的父项目又是Spring Boot Dependencies,
已经定义好了很多包的依赖,可以统一项目的依赖,避免后续的版本冲突。

Maven users can inherit from the spring-boot-starter-parent project to obtain sensible defaults. The parent project provides the following features:

Java 1.8 as the default compiler level.
UTF-8 source encoding.
A Dependency Management section, inherited from the spring-boot-dependencies pom, that manages the versions of common dependencies. This dependency management lets you omit <version> tags for those dependencies when used in your own pom.
An execution of the repackage goal with a repackage execution id.
Sensible resource filtering.
Sensible plugin configuration (exec plugin, Git commit ID, and shade).
Sensible resource filtering for application.properties and application.yml including profile-specific files (for example, application-dev.properties and application-dev.yml)
Note that, since the application.properties and application.yml files accept Spring style placeholders (${…​}), the Maven filtering is changed to use @..@ placeholders. (You can override that by setting a Maven property called resource.delimiter.)


Java
默认使用Java 8
使用UTF-8编码
一个引用管理的功能,在dependencies里的部分配置可以不用填写version信息,这些version信息会从spring-boot-dependencies里得到继承。
识别资源过滤
识别插件的配置(exec plugin, surefire, Git commit ID, shade).能够识别application.properties和application.yml类型的文件,同时也能支持profile-specific类型的文件(如: application-foo.properties and application-foo.yml,这个功能可以更好的配置不同生产环境下的配置文件)。
 
摘自官方文档https://docs.spring.io/spring-boot/docs/1.3.0.M5/reference/html/using-boot-build-systems.html

 类似资料: