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 文件为什么能合并为一个文件,且执行不报错,这个原理暂时还不知道。