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

詳解SpringBoot可執(zhí)行Jar包運(yùn)行原理

 更新時(shí)間:2023年05月22日 11:49:01   作者:鶴沖天Pro  
SpringBoot有一個(gè)很方便的功能就是可以將應(yīng)用打成可執(zhí)行的Jar,那么大家有沒想過這個(gè)Jar是怎么運(yùn)行起來(lái)的呢,本篇博客就來(lái)介紹下 SpringBoot可執(zhí)行Jar包的運(yùn)行原理,需要的朋友可以參考下

打可執(zhí)行 Jar 包

將 Spring Boot 應(yīng)用打成可執(zhí)行 Ja r包很容易,只需要在 pom 中加上一個(gè) Spring Boot 提供的插件,然后在執(zhí)行mvn package即可。

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

注意:

如果你的項(xiàng)目沒有繼承spring-boot-starter-parent這個(gè)POM,你需要做如下配置,將目標(biāo)綁定到repackage。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

關(guān)于這個(gè)插件的詳細(xì)使用,可以參考官網(wǎng)

運(yùn)行完mvn package后,我們會(huì)在 target 目錄下看到兩個(gè) jar 文件。myproject-0.0.1-SNAPSHOT.jar 和 myproject-0.0.1-SNAPSHOT.jar.original。第一個(gè) jar 文件就是我們應(yīng)用的可執(zhí)行 jar 包,第二個(gè) Jar 文件是應(yīng)用原始的 jar 包。

可執(zhí)行 Jar 包內(nèi)部結(jié)構(gòu)

將打出來(lái)的可執(zhí)行 Jar 解壓開我們能看到下面的結(jié)構(gòu):

可執(zhí)行 jar 目錄結(jié)構(gòu)

├─BOOT-INF
│  ├─classes
│  └─lib
├─META-INF
│  ├─maven
│  ├─app.properties
│  ├─MANIFEST.MF      
└─org
    └─springframework
        └─boot
            └─loader
                ├─archive
                ├─data
                ├─jar
                └─util

我們先來(lái)重點(diǎn)關(guān)注兩個(gè)地方:META-INF 下面的 Jar 包描述文件和 BOOT-INF 這個(gè)目錄。

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: xxxx
Start-Class: com.xxxx.AppServer
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.1.6.RELEASE
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_73
Main-Class: org.springframework.boot.loader.JarLauncher

在上面我們看到一個(gè)熟悉的配置Main-Class: org.springframework.boot.loader.JarLauncher。我們大概能猜到這個(gè)類是整個(gè)系統(tǒng)的入口。

再看下 BOOT-INF 這個(gè)目錄下面,我們會(huì)發(fā)現(xiàn)里面是我們項(xiàng)目打出來(lái)的 class 文件和項(xiàng)目依賴的 Jar 包??吹竭@里,你可能已經(jīng)猜到 Spring Boot 是怎么啟動(dòng)項(xiàng)目的了。

JarLauncher

public class JarLauncher extends ExecutableArchiveLauncher {

	static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";

	static final String BOOT_INF_LIB = "BOOT-INF/lib/";

	public JarLauncher() {
	}

	protected JarLauncher(Archive archive) {
		super(archive);
	}

	@Override
	protected boolean isNestedArchive(Archive.Entry entry) {
		if (entry.isDirectory()) {
			return entry.getName().equals(BOOT_INF_CLASSES);
		}
		return entry.getName().startsWith(BOOT_INF_LIB);
	}

	public static void main(String[] args) throws Exception {
        //項(xiàng)目入口,重點(diǎn)在launch這個(gè)方法中
		new JarLauncher().launch(args);
	}

}
//launch方法
protected void launch(String[] args) throws Exception {
    JarFile.registerUrlProtocolHandler();
    //創(chuàng)建LaunchedURLClassLoader。如果根類加載器和擴(kuò)展類加載器沒有加載到某個(gè)類的話,就會(huì)通過LaunchedURLClassLoader這個(gè)加載器來(lái)加載類。這個(gè)加載器會(huì)從Boot-INF下面的class目錄和lib目錄下加載類。
    ClassLoader classLoader = createClassLoader(getClassPathArchives());
    //這個(gè)方法會(huì)讀取jar描述文件中的Start-Class屬性,然后通過反射調(diào)用到這個(gè)類的main方法。
    launch(args, getMainClass(), classLoader);
}

簡(jiǎn)單總結(jié)

  • Spring Boot 可執(zhí)行 Jar 包的入口點(diǎn)是 JarLauncher 的 main 方法;
  • 這個(gè)方法的執(zhí)行邏輯是先創(chuàng)建一個(gè) LaunchedURLClassLoader,這個(gè)加載器加載類的邏輯是:先判斷根類加載器和擴(kuò)展類加載器能否加載到某個(gè)類,如果都加載不到就從 Boot-INF 下面的 class 和 lib 目錄下去加載;
  • 讀取Start-Class屬性,通過反射機(jī)制調(diào)用啟動(dòng)類的 main 方法,這樣就順利調(diào)用到我們開發(fā)的 Spring Boot 主啟動(dòng)類的 main 方法了。

遠(yuǎn)程調(diào)試

這邊介紹個(gè)調(diào)試 JarLauncher 啟動(dòng)的小技巧:IDEA 遠(yuǎn)程調(diào)試。

step1:我們以下面的方式啟動(dòng)我們的 Spring Boot 應(yīng)用

 java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar App.jar

step2:在 idea 中進(jìn)行如下配置

然后點(diǎn)擊下面的執(zhí)行按鈕執(zhí)行即可:

以上就是詳解SpringBoot可執(zhí)行Jar包運(yùn)行原理的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Jar包運(yùn)行的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java經(jīng)典面試題最全匯總208道(一)

    Java經(jīng)典面試題最全匯總208道(一)

    這篇文章主要介紹了Java經(jīng)典面試題最全匯總208道(一),本文章內(nèi)容詳細(xì),該模塊分為了六個(gè)部分,本次為第一部分,需要的朋友可以參考下
    2023-01-01
  • Java C++題解leetcode816模糊坐標(biāo)示例

    Java C++題解leetcode816模糊坐標(biāo)示例

    這篇文章主要為大家介紹了Java C++題解leetcode816模糊坐標(biāo)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Springboot常用方法參數(shù)注解示例詳解

    Springboot常用方法參數(shù)注解示例詳解

    這篇文章主要介紹了Springboot常用方法參數(shù)注解及示例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Java實(shí)現(xiàn)從jar包中讀取指定文件的方法

    Java實(shí)現(xiàn)從jar包中讀取指定文件的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)從jar包中讀取指定文件的方法,涉及java針對(duì)jar文件的讀取及查找相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Java如何獲取word文檔的條目化內(nèi)容

    Java如何獲取word文檔的條目化內(nèi)容

    這篇文章主要介紹了Java獲取word文檔的條目化內(nèi)容的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-05-05
  • Spring?Cloud?Gateway實(shí)現(xiàn)零拷貝參數(shù)校驗(yàn)的完整指南

    Spring?Cloud?Gateway實(shí)現(xiàn)零拷貝參數(shù)校驗(yàn)的完整指南

    本文將深入探討在?Spring?Cloud?Gateway?中實(shí)現(xiàn)零拷貝參數(shù)校驗(yàn)的完整方案,從問題背景、設(shè)計(jì)思路到具體實(shí)現(xiàn),提供可落地的實(shí)踐指導(dǎo),需要的朋友可以參考下
    2026-04-04
  • 解決springboot configuration processor對(duì)maven子模塊不起作用的問題

    解決springboot configuration processor對(duì)maven子模塊不起作用的問題

    這篇文章主要介紹了解決springboot configuration processor對(duì)maven子模塊不起作用的問題,本文通過圖文實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Springboot @Configuration @bean注解作用解析

    Springboot @Configuration @bean注解作用解析

    這篇文章主要介紹了springboot @Configuration @bean注解作用解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 使用Java編寫一個(gè)文件批量重命名工具

    使用Java編寫一個(gè)文件批量重命名工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Java編寫一個(gè)文件批量重命名工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • springboot整合mybatisplus的方法詳解

    springboot整合mybatisplus的方法詳解

    這篇文章主要為大家詳細(xì)介紹了springboot整合mybatisplus的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論

毕节市| 饶平县| 鹤壁市| 乐陵市| 伊宁市| 张家港市| 陇川县| 宣化县| 沛县| 福州市| 怀安县| 福泉市| 噶尔县| 温宿县| 拉萨市| 香格里拉县| 沽源县| 柯坪县| 蓬溪县| 韶山市| 嘉禾县| 理塘县| 浪卡子县| 余姚市| 凤翔县| 青阳县| 乌审旗| 绥中县| 普洱| 城口县| 定安县| 当阳市| 南昌市| 盐源县| 诸城市| 周口市| 航空| 临朐县| 乐山市| 陇南市| 乌鲁木齐市|