詳解SpringBoot的jar為什么可以直接運行
一、為什么SpringBoot的jar可以直接運行?
1.SpringBoot提供了一個插件spring-boot-maven-plugin用于把程序打包成一個可執(zhí)行的jar包。
2.Spring Boot應用打包之后,生成一個Fat jar(jar包中包含jar),包含了應用依賴的jar包和Spring Boot loader相關的
類。
3.java -jar會去找jar中的manifest文件,在那里面找到真正的啟動類(Main-Class);
4.Fat jar的啟動Main函數(shù)是JarLauncher,它負責創(chuàng)建一個LaunchedURLClassLoader來加載boot-lib下面的jar,并以一個新線程啟動應用的啟動類的Main函數(shù)(找到manifest中的Start-Class)。
二、知識延伸
Spring Boot可以使用JAR包啟動的原因
嵌入式Servlet容器:Spring Boot默認使用嵌入式的Servlet容器(如Tomcat、Jetty、Undertow等)。這使得應用程序可以打包成一個可執(zhí)行的JAR文件,包含了所有的依賴以及一個嵌入式的Servlet容器,而無需外部容器的支持。
Spring Boot Maven插件:Spring Boot提供了Maven和Gradle插件,可以將應用程序打包成可執(zhí)行的JAR文件。這個JAR文件中包含了應用程序的所有依賴以及一個主類,使得它可以被直接運行。
自動化配置:Spring Boot采用自動化配置的方式,大大減少了開發(fā)者的配置工作。這使得應用程序可以更容易地打包成一個獨立的可執(zhí)行JAR文件,而不需要太多手動配置。
內(nèi)嵌屬性文件:Spring Boot支持使用application.properties或application.yml文件來配置應用程序。這些配置文件可以被打包進JAR文件,使得應用程序在不同環(huán)境中可以方便地切換配置。
總的來說,Spring Boot通過嵌入式Servlet容器、構建工具插件以及自動化配置等機制,使得應用程序可以方便地打包成一個JAR文件,并通過java -jar
命令直接運行。這種方式簡化了部署和運維的流程。
原理
在Spring Boot項目的jar中會生成一個MANIFEST.MF文件(路徑:META-INF\MANIFEST.MF),打開該文件你會看到有一個MainClass的映射,其對應的值是一個類,就是執(zhí)行‘java -jar’命令后正式執(zhí)行的類,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’插件也會自動引入其依賴,但不能查看到源碼內(nèi)容
<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直接運行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot的LogbackLoggingSystem配置加載流程解析
這篇文章主要介紹了springboot的LogbackLoggingSystem配置加載流程源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11java實現(xiàn)一個接口調(diào)取另一個接口(接口一調(diào)取接口二)
這篇文章主要介紹了java實現(xiàn)一個接口調(diào)取另一個接口(接口一調(diào)取接口二),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例
今天小編就為大家分享一篇java 鍵盤輸入一個數(shù),輸出數(shù)組中指定元素的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Spring?@Transactional事務失效的原因分析
一個程序中不可能沒有事務,Spring中,事務的實現(xiàn)方式分為兩種:編程式事務和聲明式事務。日常項目中,我們都會使用聲明式事務?@Transactional來實現(xiàn)事務,本文來和大家聊聊什么情況會導致@Transactional事務失效2022-09-09SpringBoot配置加載,各配置文件優(yōu)先級對比方式
這篇文章主要介紹了SpringBoot配置加載,各配置文件優(yōu)先級對比方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java導入、導出excel用法步驟保姆級教程(附封裝好的工具類)
這篇文章主要介紹了Java導入、導出excel的相關資料,講解了使用Java和ApachePOI庫將數(shù)據(jù)導出為Excel文件,包括創(chuàng)建工作簿、工作表、行和單元格,設置樣式和字體,合并單元格,添加公式和下拉選擇等功能,需要的朋友可以參考下2025-03-03