1.spring-boot-loader简介
spring-boot-loader模块让你的springboot应用具备打包为可执行jar或war文件的能力。只需要引入Maven插件或者Gradle插件就可以自动生成。
2.spring-boot-loader的优势
Java中并没有标准的方法加载嵌入式的jar文件,通常都是在一个jar文件中。这种情况下,如果你要通过命令行的形式发布一个没有打包的独立程序的话,可能会出现问题。
为了解决这种问题,很多开发人员将所有的class文件都打包为一个jar文件,然后依赖其他的jar文件。但是这种方式下,开发人员很难去判断哪个依赖的文件库是被程序真正使用到的。更普遍的问题是,在不同的jar文件中,如果有相同名称的文件则会冲突。(这里说明一下,在传统的可执行jar文件中会有/META-INF/MANIFEST.MF文件,这里主要介绍两个属性:Main-Class和classpath,Main-Class是可执行jar的启动类,classpath则可以指定依赖的类库。)
3.springboot可执行jar文件结构
读者可以自行编写一个简单的springboot应用,然后用Maven插件打包。
example.jar
|
+-META-INF
| +-MANIFEST.MF
+-org
| +-springframework
| +-boot
| +-loader
| +-<spring boot loader classes>
+-BOOT-INF
+-classes
| +-mycompany
| +-project
| +-YourClasses.class
+-lib
+-dependency1.jar
+-dependency2.jar
- META-INF : 存放应用相关的元信息,如MANIFEST.MF文件。
- BOOT-INF/lib: 存放应用依赖的jar包。
- BOOT-INF/classes:存放应用编译后的class文件。
- org:存放springboot相关的class文件。
熟悉Java EE的读者可能会发现,其中目录BOOT-INF下的classes和lib和WEB-INF下的classes和lib相似。但是为什么可以通过命令行的方式去执行Jar文件呢?
4.spring-boot-loder原理
springboot应用可执行jar文件被java -jar 命令执行时,还是要按照Java官方文档的规定,命令的启动类必须配置在MANIFEST.MF文件的Main-class属性。
查看springboot应用jar包中的MANIFEST.MF发现:
Main-Class: org.springframework.boot.loader.JarLauncher
可执行JAR文件启动器-Jarlauncher
首先,在pom.xml中添加spring-boot-loader依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader</artifactId>
<scope>provided</scope>
</dependency>
在IDEA中,双击shift搜索Jarlauncher
public class JarLauncher extends ExecutableArchiveLauncher {