SpringBoot的maven插件生成可以直接启动的jar

简单使用

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 表示可以直接启动 默认为 false -->
                    <executable>true</executable>
                </configuration>
            </plugin>
        </plugins>
    </build>

package 之后生成一个 jar 包

直接启动

这个 jar 我们可以直接启动执行,不需要 java -jar 这种方式

./spring-messagequeue-1.0-SNAPSHOT.jar

原理分析

maven 中添加如下依赖,这样我们就可以看到 SpringBoot plugin 打包的源码了

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-loader</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.apache.maven.plugin-tools</groupId>
    <artifactId>maven-plugin-annotations</artifactId>
    <version>3.5</version>
</dependency>
  1. 读取 plugin 配置,判断 executable 是否为 true
  2. 如果为 true,读取 org/springframework/boot/loader/tools/launch.script 启动文件
  3. 将启动脚本文件写入到目标 jar 开头,并设置权限为可执行
  4. 接下来继续将编译后的 class 及配置文件写入到目标 jar

我们可以通过 cat 或 more 命令来查看下最终生成的 jar 文件内容

这些信息就是 launch.script 文件的内容。

启动脚本是从环境变量或者固定目录来获取到 java 执行器的。至于 shell 文件和 jar 文件为什么能合并为一个文件,且执行不报错,这个原理暂时还不知道。

参考

springboot应用启动原理(一) 将启动脚本嵌入jar

posted @ 2024-02-06 09:13  strongmore  阅读(70)  评论(0编辑  收藏  举报