亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring?Boot?打包成Jar包運行原理分析

 更新時間:2023年09月18日 10:37:47   作者:Mr_姚  
這篇文章主要為大家介紹了Spring?Boot?打包成Jar包運行的原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

SpringBoot打包

相比與傳統(tǒng)的Java打包方式,使用SpringBoot打包插件打包成jar包后,可以直接使用java -jar 運行SpringBoot項目,本篇就來分析一下運行的原理。

SpringBoot打包插件

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

打包完后會生成兩個文件,一個***.jar***.jar.original

.jar文件是SpringBoot打包后生成的文件,.jar.original是用原生方式打包生成的文件,對比一下兩個的區(qū)別

.jar.original文件

.jar文件

.jar.original就是普通的jar打包的結(jié)構(gòu),這里主要看.jar文件的結(jié)構(gòu):

  • META-INFO目錄:META-INFO/MANIFEST.MF里包含了jar包的元數(shù)據(jù),包含了項目的啟動類等信息.

  • org目錄:該目錄下包含的是啟動項目的一些類,啟動的過程就在這個包里。

  • BOOT-INFO目錄:本地項目的代碼(BOOT-INF/classes),以及所需的以依賴(BOOT-INFO/lib)

重點 META-INFO/MANIFEST.MF

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.example.demo.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.4.5
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher

這里有幾個重點的字段

  • Main-Class :jar包啟動類,這是java規(guī)定的字段,存在這個字段的情況下, 在java -jar時,jar包才會運行起來
  • Start-Class:本地項目的啟動類
  • Spring-Boot-Classes:加載應(yīng)用類的入口
  • Spring-Boot-Lib:項目所需的依賴

有了Main-Class啟動類,那就直接進(jìn)入到JarLauncher里查看運行的過程

    public static void main(String[] args) throws Exception {
        (new JarLauncher()).launch(args);
    }

JarLaunchermain方法里調(diào)用了launch方法,launch方法的具體實現(xiàn)在JarLauncher的抽象父類Launcher中實現(xiàn)

    protected void launch(String[] args) throws Exception {
        if (!this.isExploded()) {
            JarFile.registerUrlProtocolHandler();
        }
        ClassLoader classLoader = this.createClassLoader(this.getClassPathArchivesIterator());
        String jarMode = System.getProperty("jarmode");
        String launchClass = jarMode != null && !jarMode.isEmpty() ? "org.springframework.boot.loader.jarmode.JarModeLauncher" : this.getMainClass();
        this.launch(args, launchClass, classLoader);
    }

首先獲取了類加載器。

然后獲取jarMode,再根據(jù)jarMode獲取launchClass,如果沒有設(shè)置jarMode,則根據(jù)getMainClass方法獲取,getMainClass的具體實現(xiàn)在ExecutableArchiveLauncher中實現(xiàn)

 protected String getMainClass() throws Exception {
        Manifest manifest = this.archive.getManifest();
        String mainClass = null;
        if (manifest != null) {
            mainClass = manifest.getMainAttributes().getValue("Start-Class");
        }
        if (mainClass == null) {
            throw new IllegalStateException("No 'Start-Class' manifest entry specified in " + this);
        } else {
            return mainClass;
        }
    }

getMainClass里獲取了MANIFEST.MF文件里Start-Class字段的值,也就是本地項目的啟動類。

最后調(diào)用this.launch(args, launchClass, classLoader);

    protected void launch(String[] args, String launchClass, ClassLoader classLoader) throws Exception {
        Thread.currentThread().setContextClassLoader(classLoader);
        this.createMainMethodRunner(launchClass, args, classLoader).run();
    }

調(diào)用MainMethodRunnerrun()方法

    public void run() throws Exception {
        Class<?> mainClass = Class.forName(this.mainClassName, false, Thread.currentThread().getContextClassLoader());
        Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);
        mainMethod.setAccessible(true);
        mainMethod.invoke((Object)null, this.args);
    }

run()方法里通過反射拿到了項目的啟動類的main方法,從而啟動本地項目。

以上就是Spring Boot 打包成Jar包運行的原理的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot Jar包的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實現(xiàn)瀏覽器大文件上傳的示例詳解

    Java實現(xiàn)瀏覽器大文件上傳的示例詳解

    文件上傳是許多項目都有的功能,用戶上傳小文件速度一般都很快,但如果是大文件幾個g,幾十個g的時候,上傳了半天,馬上就要完成的時候,網(wǎng)絡(luò)波動一下,文件又要重新上傳,所以本文給大家介紹了Java實現(xiàn)瀏覽器大文件上傳的示例,需要的朋友可以參考下
    2024-07-07
  • jar包和war包區(qū)別解析

    jar包和war包區(qū)別解析

    jar是java普通項目打包,通常是開發(fā)時要引用通用類,打成jar包便于存放管理,war是java web項目打包,web網(wǎng)站完成后,打成war包部署到服務(wù)器,目的是為了節(jié)省資源,提供效率,這篇文章主要介紹了jar包和war包區(qū)別及理解,需要的朋友可以參考下
    2023-07-07
  • Maven腳手架如何基于jeecg實現(xiàn)快速開發(fā)

    Maven腳手架如何基于jeecg實現(xiàn)快速開發(fā)

    這篇文章主要介紹了Maven腳手架如何基于jeecg實現(xiàn)快速開發(fā),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot如何優(yōu)雅的輸出異常信息

    SpringBoot如何優(yōu)雅的輸出異常信息

    在Java中,異常(Exception)是Java程序在運行過程中出現(xiàn)的一種特殊情況,會中斷正常的程序流程,異??梢允沁\行時錯誤,也可以是編程錯誤,本文將給大家詳細(xì)的介紹一下SpringBoot如何優(yōu)雅的輸出異常信息,需要的朋友可以參考下
    2023-09-09
  • SpringBoot集成itextpdf實現(xiàn)根據(jù)模板動態(tài)生成PDF

    SpringBoot集成itextpdf實現(xiàn)根據(jù)模板動態(tài)生成PDF

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何集成itextpdf實現(xiàn)根據(jù)模板動態(tài)生成PDF,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2024-03-03
  • mybatis調(diào)用mysql存儲過程并獲取返回值方式

    mybatis調(diào)用mysql存儲過程并獲取返回值方式

    這篇文章主要介紹了mybatis調(diào)用mysql存儲過程并獲取返回值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java編程小白進(jìn)階包的作用詳解

    java編程小白進(jìn)階包的作用詳解

    這篇文章主要為大家介紹了java編程中包的作用詳解,文中通過示例分析方便大家更容易理解包的作用,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • java后端實現(xiàn)信息分頁查詢的示例代碼

    java后端實現(xiàn)信息分頁查詢的示例代碼

    在一個頁面展示大量的用戶信息不便于觀看,因此就需要采用分頁展示的方法,本文就來為大家介紹一下java后端如何實現(xiàn)信息分頁查詢,需要的小伙伴可以參考下
    2023-11-11
  • IDEA中java斷言assert語法及使用

    IDEA中java斷言assert語法及使用

    這篇文章主要介紹了IDEA中java斷言assert語法詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • spring?aop?Pointcut?execution規(guī)則介紹

    spring?aop?Pointcut?execution規(guī)則介紹

    這篇文章主要介紹了spring?aop?Pointcut?execution規(guī)則,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論