网站首页 > java教程 正文
用大白话解释Spring Boot的jar为什么可以直接运行,其实就三点核心原理:
一、核心原理
1. 内嵌了一个“迷你服务器”
Spring Boot的jar包里,自带了一个简化版的Tomcat(或其他服务器,如Jetty)。
传统方式:你的代码打包成war文件 → 扔到外部的Tomcat里运行。
Spring Boot:直接把Tomcat和你代码、依赖库一起打包成jar → 不需要外部服务器,自己就是一个“独立应用”。
2. 打包方式特殊:Fat Jar(胖罐子)
普通jar包只包含你的代码和资源文件,但Spring Boot的jar 是“胖罐子”:
包含所有依赖:比如Spring、Tomcat、数据库驱动等第三方库,全部塞进jar里。
启动入口特殊:通过META-INF/MANIFEST.MF文件中的 Main-Class,指向Spring Boot的Launcher类,而不是你的主类。
Main-Class: org.springframework.boot.loader.JarLauncher
3. 启动流程简化:Launcher代理
当你运行java -jar app.jar时:
JVM先执行JarLauncher:Spring Boot的Launcher会做两件事:加载内嵌的Tomcat:启动一个轻量级的Web服务器;加载你的代码:找到@SpringBootApplication注解的主类,初始化Spring容器。
你的应用启动:就像传统 Spring MVC项目在外部Tomcat 里运行一样,但这次是“内置”的。
二、对比传统方式
传统项目 | Spring Boot项目 |
打包成war文件 | 打包成jar文件(自带服务器) |
需要安装Tomcat,部署到 webapps目录 | 直接java -jar运行,无需安装任何服务器 |
启动命令:startup.sh | 启动命令:java -jar app.jar |
三、技术细节补充
如何打包?
使用spring-boot-maven-plugin插件,它会自动把依赖和内嵌服务器打进jar。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
为什么普通jar不能直接运行?
普通jar没有内嵌服务器,也没有Launcher引导启动流程,依赖库也不在jar里。
四、总结
Spring Boot的jar能直接运行,是因为它把服务器、依赖、代码全打包成一个“独立安装包”,像手机上的APP一样,点开就能用,不用再装其他环境。
- 上一篇: 什么情况,今年面试都不问八股文了??准备了几个月,结果一个都不问。。
- 下一篇:已经是最后一篇了
猜你喜欢
- 2025-07-03 什么情况,今年面试都不问八股文了??准备了几个月,结果一个都不问。。
- 2025-07-03 LangChain系列之如何使用LangChain4j构建RAG应用(1)
- 2025-07-03 JAVA入门教程-第2章 基本编程概念
- 2025-07-03 FTPC Pnuts语言(ftp mput put)
- 2025-07-03 这9个工具库让我的Java开发效率提升了80%
- 2025-07-03 VS2022配置x86/x64调用32位和64位汇编语言动态库环境
- 2025-07-03 别再裸写 parseFrom() 了!这才是 MQTT + Protobuf 消费的正确姿势
- 2025-07-03 aardio + Java + JavaScript 混合开发快速入门
你 发表评论:
欢迎- 最近发表
-
- JAVA面试|为什么Spring Boot的jar可以直接运行?
- 什么情况,今年面试都不问八股文了??准备了几个月,结果一个都不问。。
- LangChain系列之如何使用LangChain4j构建RAG应用(1)
- JAVA入门教程-第2章 基本编程概念
- FTPC Pnuts语言(ftp mput put)
- 这9个工具库让我的Java开发效率提升了80%
- VS2022配置x86/x64调用32位和64位汇编语言动态库环境
- 别再裸写 parseFrom() 了!这才是 MQTT + Protobuf 消费的正确姿势
- aardio + Java + JavaScript 混合开发快速入门
- 铁打的程序,流水的语言,2018年JAVA编程还想坚挺500年?
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)