为什么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文件,里面带有JarLauncherjar包启动器)。

这个jar包启动器老牛逼了。

当你运行java -jar命令的时候,JarLauncher会将BOOT-INF/classes下的类文件和BOOT-INF/lib下依赖的jar包加载到classpath下。

最后调用META-INF下的MANIFEST.MF文件的Start-Class属性来完成应用程序的启动。

也就是说它是SpringBoot Loader提供了一套标准用于执行SpringBoot 打成的JAR包.

推荐博客:

https://blog.csdn.net/qq_17555933/article/details/106676979

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值