国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot 可執(zhí)行 Jar 包運行原理

這篇具有很好參考價值的文章主要介紹了Spring Boot 可執(zhí)行 Jar 包運行原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


Spring Boot 有一個很方便的功能就是可以將應(yīng)用打成可執(zhí)行的 Jar。那么大家有沒想過這個 Jar 是怎么運行起來的呢?本篇博客就來介紹下 Spring Boot 可執(zhí)行 Jar 包的運行原理。

打可執(zhí)行 Jar 包

將 Spring Boot 應(yīng)用打成可執(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,你需要做如下配置,將目標(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)于這個插件的詳細(xì)使用,可以參考官網(wǎng)

運行完mvn package后,我們會在 target 目錄下看到兩個 jar 文件。myproject-0.0.1-SNAPSHOT.jar 和 myproject-0.0.1-SNAPSHOT.jar.original。第一個 jar 文件就是我們應(yīng)用的可執(zhí)行 jar 包,第二個 Jar 文件是應(yīng)用原始的 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 方法了。

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

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

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

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

step2:在 idea 中進行如下配置

Spring Boot 可執(zhí)行 Jar 包運行原理

然后點擊下面的執(zhí)行按鈕執(zhí)行即可:
Spring Boot 可執(zhí)行 Jar 包運行原理文章來源地址http://www.zghlxwxcb.cn/news/detail-458465.html

到了這里,關(guān)于Spring Boot 可執(zhí)行 Jar 包運行原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • SpringBoot 插件 spring-boot-maven-plugin 原理,以及SpringBoo工程部署的 jar 包瘦身實戰(zhàn)

    SpringBoot 插件 spring-boot-maven-plugin 原理,以及SpringBoo工程部署的 jar 包瘦身實戰(zhàn)

    我們直接使用 maven package (maven自帶的package打包功能),打包Jar包的時候,不會將該項目所依賴的Jar包一起打進去,在使用 java -jar 命令啟動項目時會報錯,項目無法正常啟動。這個時候,我們就可以考慮引用 spring-boot-maven-plugin 插件來為項目打Jar包。 maven項目的pom.xml中,添

    2024年02月06日
    瀏覽(25)
  • 用 Docker 構(gòu)建、運行、發(fā)布一個 Spring Boot 應(yīng)用

    用 Docker 構(gòu)建、運行、發(fā)布一個 Spring Boot 應(yīng)用 2016-03-20??Docker?Spring Boot??Docker?Spring Boot?鏡像?Docker Hub 本文演示了如何用 Docker 構(gòu)建、運行、發(fā)布來一個 Spring Boot 應(yīng)用。 Docker 簡介 Docker?是一個 Linux 容器管理工具包,具備“社交”方面,允許用戶發(fā)布容器的 image (鏡像),并

    2024年02月11日
    瀏覽(15)
  • SpringBoot-1-Spring Boot實戰(zhàn):快速搭建你的第一個應(yīng)用,以及了解原理

    SpringBoot-1-Spring Boot實戰(zhàn):快速搭建你的第一個應(yīng)用,以及了解原理

    SpringBootWeb入門 我們在之前介紹Spring的時候,已經(jīng)說過Spring官方(Spring官方)提供很多開源項目,點擊projects,看到spring家族旗下的項目 Spring發(fā)展到今天已經(jīng)形成了一種開發(fā)生態(tài)圈,Spring提供了若干個子項目,每個項目用于完成特定的功能。而我們在項目開發(fā)時,一般會偏向于選

    2024年02月12日
    瀏覽(92)
  • 天去面試的時候,遇到一個問題。我三個任務(wù),ABC,我怎么讓A執(zhí)行完執(zhí)行B,B執(zhí)行完執(zhí)行C 3個并行線程,如何解決。程池的核心運行原理和參數(shù)。

    今天去面試的時候,遇到一個問題。我三個任務(wù),ABC,我怎么讓A執(zhí)行完執(zhí)行B,B執(zhí)行完執(zhí)行C 3個并行線程,如何解決。程池的核心運行原理和參數(shù)。 1.線程池核心的參數(shù) 1.線程核心數(shù)- 線程池中始終保持的活動線程數(shù)量。 2. 最大線程數(shù) - 線程池能夠容納的最大線程數(shù)量。 3.

    2024年02月11日
    瀏覽(24)
  • Java -jar參數(shù)詳解:掌握J(rèn)ava可執(zhí)行JAR文件的運行技巧

    作為一種常用的開發(fā)語言,Java經(jīng)常使用可執(zhí)行的JAR(Java Archive)文件來打包和分發(fā)應(yīng)用程序。使用java -jar命令運行JAR文件是一種方便快捷的方式。本文將詳細(xì)介紹java -jar命令的各種參數(shù),幫助您充分利用這個功能。 一、簡介 java -jar命令用于運行可執(zhí)行的JAR文件。它會自動查

    2024年02月16日
    瀏覽(20)
  • 更新spring boot jar包中的BOOT-INF/lib目錄下的jar包

    更新spring-boot jar包中的BOOT-INF/lib目錄下的jar包 場景 需要更新lib目錄下某個jar包的配置文件 失敗的解決方法 用解壓軟件依次打開spring-boot jar包(設(shè)為a.jar)、BOOT-INF/lib目錄下的jar包(設(shè)為b.jar),然后修改配置文件后保存回a.jar包中,這樣操作在通過java -jar運行a.jar包時會導(dǎo)致

    2024年02月13日
    瀏覽(16)
  • 【Java】java | 將可運行jar打包成exe可執(zhí)行文件

    【Java】java | 將可運行jar打包成exe可執(zhí)行文件

    ????????1、javafx桌面程序,但又不想安裝jre環(huán)境 ????????2、需要將可執(zhí)行jar打包成exe ????????3、使用工具exe4j 1、下載exe4j 2、安裝 說明1: 在d盤建個exe4j的文件夾 說明2: 建個output文件jar,存放生成后的exe 3、運行 4、目錄介紹 Welcome: 工具介紹;Open可以打開歷史的

    2024年02月03日
    瀏覽(18)
  • Android系統(tǒng)部署java環(huán)境并運行Java程序執(zhí)行jar包

    Android系統(tǒng)部署java環(huán)境并運行Java程序執(zhí)行jar包

    在Android系統(tǒng)中運行jar包可通過把jar轉(zhuǎn)換為安卓系統(tǒng)可以執(zhí)行的dex文件,從而運行java程序,但這種方法只不適用于復(fù)雜的框架,本篇講述在Android設(shè)備中部署java環(huán)境并運行springboot項目。 為了運行更為復(fù)雜的java程序,可以在安卓設(shè)備中安裝AidLux(國內(nèi)軟件)或Termux(國外軟件),

    2023年04月22日
    瀏覽(20)
  • spring boot maven 手動打入外部jar包依賴

    有時候拿到第三方sdk是,以前都放在項目的某個目錄下,然后通過項目路徑去引入非常麻煩,最近找到了一個方法,可以手動將外部的jar包導(dǎo)入到本地的maven倉庫中,這樣你就可以像其他依賴一樣正常使用了。 命令如下 Windows系統(tǒng)舉例: 1、在你的jar包路徑下,cmd打開dos黑窗口

    2024年02月16日
    瀏覽(23)
  • Spring Boot java -jar --spring.profiles.active=dev 失效問題

    Spring Boot java -jar --spring.profiles.active=dev 失效問題

    之前動態(tài)部署修改配置文件的情況不多,所以也沒注意過,這個問題今天困擾了好久,經(jīng)過多方查詢后得到了解決辦法 直接上代碼 yml中的配置

    2024年02月19日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包