欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

打可執(zhí)行 Jar 包

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

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

注意:

如果你的項目沒有繼承spring-boot-starter-parent這個POM,你需要做如下配置,將目標綁定到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)于這個插件的詳細使用,可以參考官網(wǎng)

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

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

將打出來的可執(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

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

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

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

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

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 {
        //項目入口,重點在launch這個方法中
		new JarLauncher().launch(args);
	}

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

簡單總結(jié)

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

遠程調(diào)試

這邊介紹個調(diào)試 JarLauncher 啟動的小技巧:IDEA 遠程調(diào)試。

step1:我們以下面的方式啟動我們的 Spring Boot 應用

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

step2:在 idea 中進行如下配置

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

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

相關(guān)文章

  • @RequestBody獲取不到參數(shù)的問題

    @RequestBody獲取不到參數(shù)的問題

    這篇文章主要介紹了@RequestBody獲取不到參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java中的CyclicBarrier循環(huán)柵欄解析

    Java中的CyclicBarrier循環(huán)柵欄解析

    這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄解析,從字面上的意思可以知道,這個類的中文意思是"循環(huán)柵欄",大概的意思就是一個可循環(huán)利用的屏障,它的作用就是會讓所有線程都等待完成后才會繼續(xù)下一步行動,需要的朋友可以參考下
    2023-12-12
  • Java使用synchronized實現(xiàn)互斥鎖功能示例

    Java使用synchronized實現(xiàn)互斥鎖功能示例

    這篇文章主要介紹了Java使用synchronized實現(xiàn)互斥鎖功能,結(jié)合實例形式分析了Java使用synchronized互斥鎖功能簡單實現(xiàn)方法與操作技巧,需要的朋友可以參考下
    2020-05-05
  • Struts2 $,#,%詳解及實例代碼

    Struts2 $,#,%詳解及實例代碼

    這篇文章主要介紹了Struts2 $,#,%詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 簡單解析execute和submit有什么區(qū)別

    簡單解析execute和submit有什么區(qū)別

    這篇文章主要介紹了簡單解析execute和submit有什么區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • springboot項目啟動慢的問題排查方式

    springboot項目啟動慢的問題排查方式

    這篇文章主要介紹了springboot項目啟動慢的問題排查方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Mybatis和其他主流框架的整合使用過程詳解

    Mybatis和其他主流框架的整合使用過程詳解

    MyBatis最初是Apache的一個開源項目iBatis,?2010年6月這個項目由Apache?Software?Foundation遷移到了Google?Code,這篇文章主要介紹了Mybatis和其他主流框架的整合使用,需要的朋友可以參考下
    2023-11-11
  • MyBatis中的ResultMap的association和collection標簽詳解

    MyBatis中的ResultMap的association和collection標簽詳解

    這篇文章主要介紹了MyBatis中的ResultMap的association和collection標簽詳解,主要包括association標簽常用參數(shù)及id & result標簽參數(shù)詳解,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • 基于SpringAop中JoinPoint對象的使用說明

    基于SpringAop中JoinPoint對象的使用說明

    這篇文章主要介紹了基于SpringAop中JoinPoint對象的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java利用EasyExcel實現(xiàn)導出導入功能的示例代碼

    Java利用EasyExcel實現(xiàn)導出導入功能的示例代碼

    EasyExcel是一個基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的Excel處理工具。本文廢話不多說,直接上手試試,用代碼試試EasyExcel是否真的那么好用
    2022-11-11

最新評論