Springboot源码分析之项目结构

时间:2023-03-08 22:29:42

Springboot源码分析之项目结构

摘要:

  • 无论是从IDEA还是其他的SDS开发工具亦或是https://start.spring.io/ 进行解压,我们都会得到同样的一个pom.xml文件

    4.0.0

    org.springframework.boot
    spring-boot-starter-parent
    2.1.6.RELEASE

        <groupId>com.github.dqqzj</groupId>
        <artifactId>springboot</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>springboot</name>
        <packaging>jar</packaging>
        <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>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

parent标签的含义

  • 找到本地仓库的spring-boot-starter-parent 坐标

    4.0.0

    org.springframework.boot
    spring-boot-dependencies
    2.1.6.RELEASE
    ../../spring-boot-dependencies

    spring-boot-starter-parent
    pom
    Spring Boot Starter Parent
    Parent pom providing dependency and plugin management for applications
    built with Maven
    https://projects.spring.io/spring-boot/#/spring-boot-starter-parent

    <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>

    true
    ${basedir}/src/main/resources

    **/application*.yml
    **/application*.yaml
    **/application*.properties

    ${basedir}/src/main/resources

    **/application*.yml
    **/application*.yaml
    **/application.properties

    org.jetbrains.kotlin
    kotlin-maven-plugin
    ${kotlin.version}

    compile
    compile

    compile

    test-compile
    test-compile

    test-compile

    ${java.version}
    true

    maven-compiler-plugin

    true

    maven-failsafe-plugin

    integration-test
    verify

    ${project.build.outputDirectory}

    maven-jar-plugin

    ${start-class}
    true

    maven-war-plugin

    ${start-class}
    true

    org.codehaus.mojo
    exec-maven-plugin

    ${start-class}

    maven-resources-plugin

    ${resource.delimiter}

    false

    pl.project13.maven
    git-commit-id-plugin

    revision

    true
    yyyy-MM-dd'T'HH:mm:ssZ
    true
    ${project.build.outputDirectory}/git.properties

    org.springframework.boot
    spring-boot-maven-plugin

    repackage

    repackage

    ${start-class}

    maven-shade-plugin

    package

    shade

    META-INF/spring.handlers

    META-INF/spring.factories

    META-INF/spring.schemas

    ${start-class}

    org.springframework.boot
    spring-boot-maven-plugin
    2.1.6.RELEASE

    true
    true

    :

    META-INF/.SF
    META-INF/.DSA
    META-INF/
    .RSA

    org.eclipse.m2e
    lifecycle-mapping
    1.0.0

    org.codehaus.mojo
    flatten-maven-plugin
    [1.0.0,)

    flatten

    org.apache.maven.plugins
    maven-checkstyle-plugin
    [3.0.0,)

    check

关注点
  •   <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-dependencies</artifactId>
          <version>2.1.6.RELEASE</version>
          <relativePath>../../spring-boot-dependencies</relativePath>
        </parent>

说明我们的工程可以进行改造进行替换掉原来工程的parent标签.

  • <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
              <executions>
                <execution>
                  <id>repackage</id>
                  <goals>
                    <goal>repackage</goal>
                  </goals>
                </execution>
              </executions>
              <configuration>
                <mainClass>${start-class}</mainClass>
              </configuration>
            </plugin>

    repackage必须要有否则打jar包时候无法正常启动.
    Springboot源码分析之项目结构

在配置文件加上repackage即可

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

IDEA自带maven工具

Springboot源码分析之项目结构

mvnw是基于linuxshell脚本命令

mvnw.cmd是基于windows的脚本命令

.mvn包含了maven下载路径以及版本等信息

也就是说我们完全不用自己下载maven而是可以直接使用IDEA给我们提供的工具即可,只不过通常不会这么做。

repackage的作用

  • 官方文档
  • 正常情况下打包会生成springboot-0.0.1-SNAPSHOT.jar,original,springboot-0.0.1-SNAPSHOT.jar这样的2个文件,而repackage的作用就是将springboot-0.0.1-SNAPSHOT.jar.original重新打包为我们可以执行的springboot-0.0.1-SNAPSHOT.jar