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>






- 读取 plugin 配置,判断 executable 是否为 true
- 如果为 true,读取 org/springframework/boot/loader/tools/launch.script 启动文件
- 将启动脚本文件写入到目标 jar 开头,并设置权限为可执行
- 接下来继续将编译后的 class 及配置文件写入到目标 jar
我们可以通过 cat 或 more 命令来查看下最终生成的 jar 文件内容

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

启动脚本是从环境变量或者固定目录来获取到 java 执行器的。至于 shell 文件和 jar 文件为什么能合并为一个文件,且执行不报错,这个原理暂时还不知道。
参考
分类:
spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示