81、为什么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包启动的原因

  1. 嵌入式Servlet容器:Spring Boot默认使用嵌入式的Servlet容器(如Tomcat、Jetty、Undertow等)。这使得应用程序可以打包成一个可执行的JAR文件,包含了所有的依赖以及一个嵌入式的Servlet容器,而无需外部容器的支持。

  2. Spring Boot Maven插件:Spring Boot提供了Maven和Gradle插件,可以将应用程序打包成可执行的JAR文件。这个JAR文件中包含了应用程序的所有依赖以及一个主类,使得它可以被直接运行。

  3. 自动化配置:Spring Boot采用自动化配置的方式,大大减少了开发者的配置工作。这使得应用程序可以更容易地打包成一个独立的可执行JAR文件,而不需要太多手动配置。

  4. 内嵌属性文件: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);
}
转载请说明出处内容投诉
CSS教程_站长资源网 » 81、为什么SpringBoot的jar可以直接运行?

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买