最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot?打包成Jar包運(yùn)行原理分析

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

SpringBoot打包

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

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ù),包含了項(xiàng)目的啟動類等信息.

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

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

重點(diǎn) 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

這里有幾個重點(diǎn)的字段

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

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

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

JarLaunchermain方法里調(diào)用了launch方法,launch方法的具體實(shí)現(xiàn)在JarLauncher的抽象父類Launcher中實(shí)現(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的具體實(shí)現(xiàn)在ExecutableArchiveLauncher中實(shí)現(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字段的值,也就是本地項(xiàng)目的啟動類。

最后調(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()方法里通過反射拿到了項(xiàng)目的啟動類的main方法,從而啟動本地項(xiàng)目。

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

相關(guān)文章

  • 舉例解析Java多線程編程中需要注意的一些關(guān)鍵點(diǎn)

    舉例解析Java多線程編程中需要注意的一些關(guān)鍵點(diǎn)

    這篇文章主要介紹了Java多線程編程中需要注意的一些關(guān)鍵點(diǎn),包括ThreadLocal變量與原子更新等一些深層次的內(nèi)容,需要的朋友可以參考下
    2015-11-11
  • Java中死鎖問題及解決方法

    Java中死鎖問題及解決方法

    本文主要介紹了Java中死鎖問題及解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • SpringBoot+minio+kkfile實(shí)現(xiàn)文件預(yù)覽功能

    SpringBoot+minio+kkfile實(shí)現(xiàn)文件預(yù)覽功能

    在現(xiàn)代的 Web 應(yīng)用中,文件預(yù)覽功能是提升用戶體驗(yàn)的重要部分,尤其是在文檔管理系統(tǒng)中,本文將帶你逐步實(shí)現(xiàn)如何在 Spring Boot 項(xiàng)目中集成 MinIO(一個對象存儲系統(tǒng))與 KKFileView(一個開源文件預(yù)覽工具),以實(shí)現(xiàn)對各種類型文件的在線預(yù)覽,需要的朋友可以參考下
    2024-12-12
  • java軟引用在瀏覽器使用實(shí)例講解

    java軟引用在瀏覽器使用實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于java軟引用在瀏覽器使用實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • Java多線程通訊之wait,notify的區(qū)別詳解

    Java多線程通訊之wait,notify的區(qū)別詳解

    這篇文章主要介紹了Java多線程通訊之wait,notify的區(qū)別詳解,非常不錯,具有一定的參考借鑒借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Spring創(chuàng)建BeanDefinition之路徑掃描詳解

    Spring創(chuàng)建BeanDefinition之路徑掃描詳解

    這篇文章主要介紹了Spring創(chuàng)建BeanDefinition之路徑掃描方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java中難理解的四個概念

    Java中難理解的四個概念

    這篇文章主要介紹了匿名內(nèi)部類、多線程、如何實(shí)現(xiàn)同步、序列化,這四個難理解的概念,同學(xué)們一定要仔細(xì)看看
    2021-04-04
  • idea使用.env運(yùn)行SpringBoot項(xiàng)目

    idea使用.env運(yùn)行SpringBoot項(xiàng)目

    在SpringBoot項(xiàng)目中,通過.env文件管理敏感配置和環(huán)境參數(shù)比硬編碼在application.yml中更安全規(guī)范,本文就來介紹一下如何使用,感興趣的可以了解一下
    2026-02-02
  • Java如何獲取JSON中某個對象的值

    Java如何獲取JSON中某個對象的值

    這篇文章主要介紹了Java如何獲取JSON中某個對象的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • MyBatis存儲過程、MyBatis分頁、MyBatis一對多增刪改查操作

    MyBatis存儲過程、MyBatis分頁、MyBatis一對多增刪改查操作

    本文通過一段代碼給大家介紹了MyBatis存儲過程、MyBatis分頁、MyBatis一對多增刪改查操作,非常不錯,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-11-11

最新評論

曲阜市| 祥云县| 镇安县| 清丰县| 大港区| 墨玉县| 庄河市| 石泉县| 那坡县| 边坝县| 静宁县| 阿勒泰市| 离岛区| 太白县| 辰溪县| 海阳市| 抚顺市| 阳山县| 阳朔县| 湟中县| 遵义县| 沂水县| 岐山县| 丹东市| 含山县| 会泽县| 赤壁市| 忻州市| 崇明县| 东阿县| 大渡口区| 汽车| 太和县| 蓬莱市| 孟津县| 大悟县| 沾化县| 武平县| 永康市| 天台县| 友谊县|