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

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

 更新時(shí)間: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)目,本篇就來(lái)分析一下運(yùn)行的原理。

SpringBoot打包插件

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

打包完后會(huì)生成兩個(gè)文件,一個(gè)***.jar***.jar.original

.jar文件是SpringBoot打包后生成的文件,.jar.original是用原生方式打包生成的文件,對(duì)比一下兩個(gè)的區(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)目的啟動(dòng)類等信息.

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

  • 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

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

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

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

    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,如果沒(méi)有設(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)目的啟動(dò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()方法里通過(guò)反射拿到了項(xiàng)目的啟動(dòng)類的main方法,從而啟動(dòng)本地項(xiàng)目。

以上就是Spring Boot 打包成Jar包運(yùn)行的原理的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot Jar包的資料請(qǐng)關(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中死鎖問(wèn)題及解決方法

    Java中死鎖問(wèn)題及解決方法

    本文主要介紹了Java中死鎖問(wèn)題及解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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(一個(gè)對(duì)象存儲(chǔ)系統(tǒng))與 KKFileView(一個(gè)開(kāi)源文件預(yù)覽工具),以實(shí)現(xiàn)對(duì)各種類型文件的在線預(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ū)別詳解,非常不錯(cuò),具有一定的參考借鑒借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • Spring創(chuàng)建BeanDefinition之路徑掃描詳解

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

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

    Java中難理解的四個(gè)概念

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

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

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

    Java如何獲取JSON中某個(gè)對(duì)象的值

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

    MyBatis存儲(chǔ)過(guò)程、MyBatis分頁(yè)、MyBatis一對(duì)多增刪改查操作

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

最新評(píng)論

德惠市| 星座| 甘孜| 浏阳市| 通化市| 泊头市| 山东省| 肇东市| 阿勒泰市| 司法| 汾阳市| 渝中区| 石门县| 库伦旗| 洛扎县| 株洲市| 军事| 沂南县| 长沙市| 包头市| 河池市| 交城县| 株洲市| 天镇县| 雷州市| 健康| 民权县| 西吉县| 赫章县| 丁青县| 吉安县| 江津市| 郁南县| 扶余县| 石狮市| 桐梓县| 和顺县| 磴口县| 缙云县| 扬州市| 昭平县|