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

淺析Spring Boot中的spring-boot-load模塊

 更新時(shí)間:2018年01月26日 11:18:21   作者:并發(fā)編程網(wǎng) - ifeve.com  
spring-boot-loader模塊允許我們使用java -jar archive.jar運(yùn)行包含嵌套依賴jar的jar或者war文件,它提供了三種類啟動器。下面通過本文給大家介紹spring-boot-load模塊的相關(guān)知識,感興趣的朋友一起看看吧

一、前言

正常情況下classloader只能找到j(luò)ar里面當(dāng)前目錄或者文件類里面的*.class文件。為了能夠加載嵌套jar里面的資源之前都是把嵌套jar里面的class文件和應(yīng)用的class文件打包為一個(gè)jar,這樣就不存在嵌套jar了,但是這樣做就不能很清晰的知道應(yīng)用到底依賴了哪些東西,哪些是應(yīng)用自己的,另外多個(gè)jar里面的class可能內(nèi)容不一樣但是文件名卻一樣。springboot中spring-boot-loader就是為優(yōu)雅解決這個(gè)問題而誕生的。

spring-boot-loader模塊允許我們使用java -jar archive.jar運(yùn)行包含嵌套依賴jar的jar或者war文件,它提供了三種類啟動器 (JarLauncher, WarLauncher and PropertiesLauncher),這些類啟動器的目的一樣都是為了能夠加載嵌套在jar里面的資源(比如class文件,配置文件等)。[Jar|War]Launcher固定去查找當(dāng)前jar的lib目錄里面的嵌套jar文件里面的資源。

二、spring-boot-loader模塊提供的jar目錄結(jié)構(gòu)

Springboot中jar文件格式固定如下:

archive.jar
 |
 +-META-INF(1)
 | +-MANIFEST.MF
 +-org(2)
 | +-springframework
 | +-boot
 | +-loader
 |  +-<spring boot loader classes>
 +-com(3)
 | +-mycompany
 | + project
 | +-YouClasses.class
 +-lib(4)
 +-dependency1.jar
 +-dependency2.jar
  • 結(jié)構(gòu)(1)jar文件中MANIFEST.MF文件存放處
  • 結(jié)構(gòu)(2) Spring-boot-loader本身需要的class放置處
  • 結(jié)構(gòu)(3) 應(yīng)用本身的文件放置處
  • 結(jié)構(gòu)(4)應(yīng)用依賴的jar固定放到lib目錄。

那么spring-boot是如何去按照這個(gè)結(jié)構(gòu)加載資源那?

  • 首先在打包時(shí)候會使用spring-boot-maven-plugin插件重寫打成的jar文件,會設(shè)置META-INF/MANIFEST.MF中的
Main-Class: org.springframework.boot.loader.JarLauncher 
Start-Class: com.mycompany.project.MyApplication

并拷貝spring-boot-loader包里面的class文件到結(jié)構(gòu)(2),應(yīng)用依賴拷貝到(4)應(yīng)用類拷貝到(3)

  • 通過java -jar archive.jar 運(yùn)行時(shí)候Launcher會去加載JarLauncher類并執(zhí)行其中的main函數(shù),JarLauncher主要關(guān)心構(gòu)造一個(gè)合適的URLClassLoader加載器用來調(diào)用我們應(yīng)用程序(MyApplication)的main方法。

三、spring-boot-maven-plugin插件打包流程分析

 

注:這里需要思考下為何要拷貝本來應(yīng)該放入到lib里面的spring-boot-loader.jar里面的class到結(jié)構(gòu)(2)?

四、JarLauncher執(zhí)行流程分析

 

看完這個(gè)流程在分析下第三節(jié)留的問題,如流程圖首先使用Appclassloader加載了JarLauncher類并創(chuàng)建了LaunchedURLClassLoader類,而LaunchedURLClassLoader是屬于spring-boot-loader.jar包里面的,而Appclassloader是普通的加載器不能加載嵌套的jar里面的文件,所以如果把spring-boot-loader.jar放到lib 目錄下,Appclassloader將找不到LaunchedURLClassLoader。所以在打包時(shí)候

拷貝本來應(yīng)該放入到lib里面的spring-boot-loader.jar里面的class到結(jié)構(gòu)(2)。

五、總結(jié)

spring-boot-load模塊通過自定義jar包結(jié)構(gòu)自定義類加載器優(yōu)雅的實(shí)現(xiàn)了嵌套jar資源的加載,通過打包時(shí)候重新設(shè)置啟動類和組織jar結(jié)構(gòu),通過運(yùn)行時(shí)設(shè)置自定義加載器來實(shí)現(xiàn)嵌套jar資源加載。

相關(guān)文章

  • 如何使用Spring Boot實(shí)現(xiàn)自定義Spring Boot插件

    如何使用Spring Boot實(shí)現(xiàn)自定義Spring Boot插件

    在本文中,我們介紹了如何使用 Spring Boot 實(shí)現(xiàn)自定義插件,使用自定義插件可以幫助我們快速地添加一些額外的功能,提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Spring多線程的使用以及問題詳解

    Spring多線程的使用以及問題詳解

    在我們開發(fā)系統(tǒng)過程中,經(jīng)常會處理一些費(fèi)時(shí)間的任務(wù)(如:向數(shù)據(jù)庫中插入大量數(shù)據(jù)),這個(gè)時(shí)候就就需要使用多線程,下面這篇文章主要給大家介紹了關(guān)于Spring多線程的使用以及問題的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • SpringBoot項(xiàng)目解決跨域的四種方案分享

    SpringBoot項(xiàng)目解決跨域的四種方案分享

    在用SpringBoot開發(fā)后端服務(wù)時(shí),我們一般是提供接口給前端使用,但前端通過瀏覽器調(diào)我們接口時(shí),瀏覽器會有個(gè)同源策略的限制,即協(xié)議,域名,端口任一不一樣時(shí)都會導(dǎo)致跨域,這篇文章主要介紹跨域的幾種常用解決方案,希望對大家有所幫助
    2023-05-05
  • 基于java流實(shí)現(xiàn)壓縮圖片過程解析

    基于java流實(shí)現(xiàn)壓縮圖片過程解析

    這篇文章主要介紹了基于java流實(shí)現(xiàn)壓縮圖片過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 使用Jenkins一鍵打包部署SpringBoot項(xiàng)目的步驟詳解

    使用Jenkins一鍵打包部署SpringBoot項(xiàng)目的步驟詳解

    任何簡單操作的背后,都有一套相當(dāng)復(fù)雜的機(jī)制,本文將以SpringBoot應(yīng)用的在Docker環(huán)境下的打包部署為例,詳細(xì)講解如何使用Jenkins一鍵打包部署SpringBoot應(yīng)用,文中通過圖文結(jié)合講解的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Java中將List列表轉(zhuǎn)換為字符串的三種方法

    Java中將List列表轉(zhuǎn)換為字符串的三種方法

    這篇文章主要介紹了如何在 Java中將List 轉(zhuǎn)換為 String,接下來使用Java 8 Streams Collectors api和String.join()方法將帶有逗號分隔符或自定義分隔符的集合轉(zhuǎn)換為字符串,需要的朋友可以參考下
    2025-04-04
  • MyBatis中多對多關(guān)系的映射和查詢

    MyBatis中多對多關(guān)系的映射和查詢

    本文主要介紹了MyBatis中多對多關(guān)系的映射和查詢的相關(guān)知識。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • 如何解決Project SDK is not defined問題

    如何解決Project SDK is not defined問題

    這篇文章主要介紹了如何解決Project SDK is not defined問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式詳細(xì)講解

    Java結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式詳細(xì)講解

    橋接,顧名思義,就是用來連接兩個(gè)部分,使得兩個(gè)部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實(shí)現(xiàn)部分分離解耦,使他們可以獨(dú)立的變化。本文通過示例詳細(xì)介紹了橋接模式的原理與使用,需要的可以參考一下
    2022-09-09
  • SpringCloud Gateway的路由,過濾器和限流解讀

    SpringCloud Gateway的路由,過濾器和限流解讀

    這篇文章主要介紹了SpringCloud Gateway的路由,過濾器和限流解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論

凌海市| 靖远县| 泾川县| 东莞市| 佳木斯市| 洱源县| 澳门| 和林格尔县| 江西省| 揭东县| 通许县| 喜德县| 永兴县| 比如县| 平罗县| 道真| 饶阳县| 宜兰市| 邯郸县| 尼木县| 龙州县| 内黄县| 新化县| 淮阳县| 金乡县| 丰镇市| 哈巴河县| 乌海市| 井研县| 铜山县| 玛纳斯县| 洛阳市| 安塞县| 汕尾市| 逊克县| 介休市| 紫金县| 琼中| 揭东县| 区。| 永吉县|