详解SpringBoot的jar为什么可以直接运行
一、为什么SpringBoot的jar可以直接运行?
1.SpringBoot提供了一个插件spring-boot-maven-plugin用于把程序打包成一个可执行的jar包。
2.Spring Boot应用打包之后,生成一个Fat jar(jar包中包含jar),包含了应用依赖的jar包和Spring Boot loader相关的
类。
3.java -jar会去找jar中的manifest文件,在那里面找到真正的启动类(Main-Class);
4.Fat jar的启动Main函数是JarLauncher,它负责创建一个LaunchedURLClassLoader来加载boot-lib下面的jar,并以一个新线程启动应用的启动类的Main函数(找到manifest中的Start-Class)。
二、知识延伸
Spring Boot可以使用JAR包启动的原因
嵌入式Servlet容器:Spring Boot默认使用嵌入式的Servlet容器(如Tomcat、Jetty、Undertow等)。这使得应用程序可以打包成一个可执行的JAR文件,包含了所有的依赖以及一个嵌入式的Servlet容器,而无需外部容器的支持。
Spring Boot Maven插件:Spring Boot提供了Maven和Gradle插件,可以将应用程序打包成可执行的JAR文件。这个JAR文件中包含了应用程序的所有依赖以及一个主类,使得它可以被直接运行。
自动化配置:Spring Boot采用自动化配置的方式,大大减少了开发者的配置工作。这使得应用程序可以更容易地打包成一个独立的可执行JAR文件,而不需要太多手动配置。
内嵌属性文件:Spring Boot支持使用application.properties或application.yml文件来配置应用程序。这些配置文件可以被打包进JAR文件,使得应用程序在不同环境中可以方便地切换配置。
总的来说,Spring Boot通过嵌入式Servlet容器、构建工具插件以及自动化配置等机制,使得应用程序可以方便地打包成一个JAR文件,并通过java -jar
命令直接运行。这种方式简化了部署和运维的流程。
原理
在Spring Boot项目的jar中会生成一个MANIFEST.MF文件(路径:META-INF\MANIFEST.MF),打开该文件你会看到有一个MainClass的映射,其对应的值是一个类,就是执行‘java -jar’命令后正式执行的类,mainclass类是springboot插件引入后自动添加的
Manifest-Version: 1.0 Implementation-Title: executable-jar Implementation-Version: 1.0-SNAPSHOT Archiver-Version: Plexus Archiver Built-By: Format Start-Class: spring.study.executablejar.ExecutableJarApplication Implementation-Vendor-Id: spring.study Spring-Boot-Version: 1.3.5.RELEASE Created-By: Apache Maven 3.2.3 Build-Jdk: 1.8.0_20 Implementation-Vendor: Pivotal Software, Inc. Main-Class: org.springframework.boot.loader.JarLauncher
如果想看JarLauncher类的源码需要手动引入‘spring-boot-loader’依赖,其实声明‘spring-boot-maven-plugin’插件也会自动引入其依赖,但不能查看到源码内容
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-loader</artifactId> </dependency>
打开之后可以看到此类有一个主程序入口,main方法
protected void launch(String[] args) throws Exception { JarFile.registerUrlProtocolHandler(); //自定义类加载器加载jar文件 ClassLoader classLoader = createClassLoader(getClassPathArchives()); //关注getMainClass方法 launch(args, getMainClass(), classLoader); }
到此这篇关于详解为什么SpringBoot的jar可以直接运行的文章就介绍到这了,更多相关SpringBoot jar直接运行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
springboot dynamic多数据源demo以及常见切换、事务的问题
这篇文章主要介绍了springboot dynamic多数据源demo以及常见切换、事务的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-07-07SpringBoot JdbcTemplate批量操作的示例代码
本篇文章主要介绍了SpringBoot JdbcTemplate批量操作的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-04-04
最新评论