为什么springboot打成的jar能直接运行?
今天公司主管问我一个问题,你开发的项目是在什么服务器上运行的。
我说,我开发的项目最终是打成jar包,它是一个可执行文件,依赖java运行环境,也就是jre,它不需要服务器,可以单独运行。
主管说,哦。
但是我对这个回答不太满意,我想知道它为什么可以单独运行,为什么输入java -jar,它就启动了。
于是,有了这篇文章。
首先,找个我打好的jar包,举例。
org:主要存放springboot相关的class文件
META-INF:主要存放maven和MANIFEST.MF文件
BOOT-INF/classes:主要存放应用编译后的class文件
BOOT-INF/lib:主要存放应用依赖的jar包文件
首先找到META-INF
文件下的MANIFEST.MF
文件。
内容如下:
Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: USER
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.layman.file.LaymanFileApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.5.6
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_202
Main-Class: org.springframework.boot.loader.JarLauncher
这里面有两个重要的属性
Start-Class: com.layman.file.LaymanFileApplication
Main-Class: org.springframework.boot.loader.JarLauncher
首先,看最后一行:Main-Class: org.springframework.boot.loader.JarLauncher
。
当你运行java -jar
命令的时候,它会找META-INF
文件下的MANIFEST.MF
文件中的Main-Class
,最后找到org.springframework.boot.loader.JarLauncher
。
这个JarLauncher
,翻译一下,叫做jar包启动器
。
这个东西是哪来的?
实际上,它是maven打包的时候弄进去的,也就是在pom.xml中定义的spring-boot-maven-plugin
插件
就是这玩意:
<build>
<finalName>${project.artifactId}</finalName>
<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>
tips:只有添加了
spring-boot-maven-plugin
插件,运行mvn:package
命令后打成的jar包才能直接运行。
这个插件在打包时,会生成MANIFEST.MF
文件,里面带有JarLauncher
(jar包启动器
)。
这个jar包启动器
老牛逼了。
当你运行java -jar命令的时候,JarLauncher
会将BOOT-INF/classes
下的类文件和BOOT-INF/lib
下依赖的jar包加载到classpath
下。
最后调用META-INF
下的MANIFEST.MF
文件的Start-Class
属性来完成应用程序的启动。
也就是说它是SpringBoot Loader
提供了一套标准用于执行SpringBoot 打成的JAR包.
推荐博客:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!