精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

當我們的執行 Java -jar xxx.jar 的時候底層到底做了什么?

開發 前端
通過上面的內容我們知道了當我們在執行 java -jar? 的時候,根據 java? 官方規范會引導 jar? 包里面 MANIFEST.MF? 文件中的 Main-Class? 屬性對應的啟動類,該啟動類中必須包含 main() 方法。

大家都知道我們常用的 SpringBoot? 項目最終在線上運行的時候都是通過啟動 java -jar xxx.jar 命令來運行的。

那你有沒有想過一個問題,那就是當我們執行 java -jar? 命令后,到底底層做了什么就啟動了我們的 SpringBoot 應用呢?

或者說一個 SpringBoot 的應用到底是如何運行起來的呢?今天阿粉就帶大家來看下。

認識 jar

在介紹 java -jar? 運行原理之前我們先看一下 jar? 包里面都包含了哪些內容,我們準備一個 SpringBoot? 項目,通過在 https://start.spring.io/ 上我們可以快速創建一個 SpringBoot? 項目,下載一個對應版本和報名的 zip 包。

圖片

下載后的項目我們在 pom? 依賴里面可以看到有如下依賴,這個插件是我們構建可執行 jar? 的前提,所以如果想要打包成一個 jar? 那必須在 pom? 有增加這個插件,從 start.spring.io 上創建的項目默認是會帶上這個插件的。

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

接下來我們執行 mvn package?,執行完過后在項目的 target? 目錄里面我們可以看到有如下兩個 jar? 包,我們分別把這兩個 jar? 解壓一下看看里面的內容,.original? 后綴的 jar 需要把后面的 .original? 去掉就可以解壓了。jar? 文件的解壓跟我們平常的 zip? 解壓是一樣的,jar? 文件采用的是 zip? 壓縮格式存儲,所以任何可以解壓 zip? 文件的軟件都可以解壓 jar 文件。

圖片

解壓過后,我們對比兩種解壓文件,可以發現,兩個文件夾中的內容還是有很大區別的,如下所示,左側是 demo-jar-0.0.1-SNAPSHOT.jar? 右側是對應的 original jar。

其中有一些相同的文件夾和文件,比如 META-INF,application.properties? 等,而且我們可以明顯的看到左側的壓縮包中有項目需要依賴的所有庫文件,存放于 lib 文件夾中。

圖片

所以我們可以大膽的猜測,左側的壓縮包就是 spring-boot-maven-plugin 這個插件幫我們把依賴的庫以及相應的文件調整了一下目錄結構而生成的,事實其實也是如此。

java -jar 原理

首先我們要知道的是這個 java -jar? 不是什么新的東西,而是 java? 本身就自帶的命令,而且 java -jar? 命令在執行的時候,命令本身對于這個 jar? 是不是 SpringBoot? 項目是不感知的,只要是符合 Java? 標準規范的 jar 都可以通過這個命令啟動。

圖片

而在 Java? 官方文檔顯示,當 -jar? 參數存在的時候,jar? 文件資源里面必須包含用 Main-Class? 指定的一個啟動類,而且同樣根據規范這個資源文件 MANIFEST.MF? 必須放在 /META-INF/? 目錄下。對比我們上面解壓后的文件,可以看到在左側的資源文件 MANIFEST.MF 文件中有如圖所示的一行。

![](/Users/silence/Library/Application Support/typora-user-images/image-20221206214011822.png)

圖片

可以看到這里的 Main-Class? 屬性配置的是 org.springframework.boot.loader.JarLauncher?,而如果小伙伴更仔細一點的話,會發現我們項目的啟動類也在這個文件里面,是通過 Start-Class? 字段來表示的,Start-Class? 這個屬性不是 Java 官方的屬性。

由此我們先大膽的猜測一下,當我們在執行 java -jar? 的時候,由于我們的 jar? 里面存在 MANIFEST.MF? 文件,并且其中包含了 Main-Class? 屬性且配置了 org.springframework.boot.loader.JarLauncher? 類,通過調用 JarLauncher? 類結合 Start-Class 屬性引導出我們項目的啟動類進行啟動。接下來我們就通過源碼來驗證一下這個猜想。

因為 JarLauncher? 類是在 spring-boot-loader? 模塊,所以我們在 pom 文件中增加如下依賴,就可以下載源碼進行跟蹤了。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-loader</artifactId>
<scope>provided</scope>
</dependency>

通過源碼我們可以看到 JarLauncher 類的代碼如下

package org.springframework.boot.loader;

import org.springframework.boot.loader.archive.Archive;
import org.springframework.boot.loader.archive.Archive.EntryFilter;

public class JarLauncher extends ExecutableArchiveLauncher {

static final EntryFilter NESTED_ARCHIVE_ENTRY_FILTER = (entry) -> {
if (entry.isDirectory()) {
return entry.getName().equals("BOOT-INF/classes/");
}
return entry.getName().startsWith("BOOT-INF/lib/");
};

public JarLauncher(){
}

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

@Override
protected boolean isPostProcessingClassPathArchives(){
return false;
}

@Override
protected boolean isNestedArchive(Archive.Entry entry){
return NESTED_ARCHIVE_ENTRY_FILTER.matches(entry);
}

@Override
protected String getArchiveEntryPathPrefix(){
return "BOOT-INF/";
}

public static void main(String[] args) throws Exception {
new JarLauncher().launch(args);
}

}

其中有兩個點我們可以關注一下,第一個是這個類有一個 main? 方法,這也是為什么 java -jar? 命令可以進行引導的原因,畢竟 java? 程序都是通過 main? 方法進行運行的。其次是這里面有兩個路徑 BOOT-INF/classes/? 和 BOOT-INF/lib/ 這兩個路徑正好是我們的源碼路徑和第三方依賴路徑。

而 JarLauncher? 類里面的 main()? 方法主要是運行 Launcher? 里面的 launch() 方法,這幾個類的關系圖如下所示:

圖片

跟著代碼我們可以看到最終調用的是這個 run() 方法。

圖片

圖片

而這里的參數 mainClass? 和 launchClass? 都是通過通過下面的邏輯獲取的,都是通過資源文件里面的 Start-Class 來進行獲取的,這里正是我們項目的啟動類,由此可以看到我們上面的猜想是正確的。

圖片

擴展

上面的類圖當中我們還可以看到除了有 JarLauncher? 以外還有一個 WarLauncher? 類,確實我們的 SpringBoot? 項目也是可以配置成 war? 進行部署的。我們只需要將打包插件里面的 jar? 更換成 war? 即可。大家可以自行嘗試重新打包解壓進行分析,這里 war? 包部署方式只研究學習就好了,SpringBoot? 應用還是盡量都使用 Jar 的方式進行部署。

總結

通過上面的內容我們知道了當我們在執行 java -jar? 的時候,根據 java? 官方規范會引導 jar? 包里面 MANIFEST.MF? 文件中的 Main-Class? 屬性對應的啟動類,該啟動類中必須包含 main() 方法。

而對于我們 SpringBoot? 項目構建的 ja?r 包,除了 Main-Class? 屬性外還會有一個 Start-Class? 屬性綁定的是我們項目的啟動類,當我們在執行 java -jar? 的時候優先引導的是 org.springframework.boot.loader.JarLauncher#main? 方法,該方法內部會通過引導 Start-Class 屬性來啟動我們的應用代碼。

通過上面的分析相比大家對于 SpringBoot? 是如何通過 java -jar? 進行啟動了有了一個詳細的了解,下次再有人問 ?SpringBoot 項目是如何啟動的,請把這篇文章轉發給他。

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2019-12-24 11:19:44

容器DockerLinux

2016-11-22 23:44:56

2019-06-04 14:36:04

高并發Java架構

2019-03-18 10:08:18

RSACRSA大會 網絡安全

2018-06-05 18:10:43

CTO訓練營技術管理金融科技

2022-04-28 13:02:32

cpu指令編程

2011-04-19 10:04:25

NeopPIshell網站后門

2022-03-11 21:28:31

部署開發服務器

2018-04-24 16:38:49

招聘經驗主導

2014-11-11 09:17:41

2009-07-08 15:18:00

JAR文件包jar命令

2020-11-16 15:47:05

SaaS軟件轉型

2022-11-11 09:28:57

軟件設計DDD

2012-08-03 09:14:23

2021-06-23 15:12:59

WiFi路由器網絡

2024-07-26 08:35:29

2019-03-20 16:34:56

華為中國生態伙伴大會2AI

2014-06-25 09:11:48

技術

2017-03-07 15:43:28

編程語言函數數據結構

2016-08-12 10:11:22

點贊
收藏

51CTO技術棧公眾號

欧美日韩一本到| 影音先锋在线一区| 欧美视频在线一区| 老司机av福利| 乱精品一区字幕二区| 裸体一区二区| 日韩有码视频在线| 精品人妻一区二区三| 亚洲一区二区三区在线播放| 久久99精品国产麻豆不卡| 在线观看国产精品91| 国产成人精品一区二区在线| 五月天视频在线观看| 青青草原国产在线| 国产亚洲制服色| 91免费版网站入口| 在线观看亚洲天堂| 99久久99久久精品国产片桃花| 欧美成人女星排行榜| 欧美中文字幕一区二区三区亚洲| 一区二区三区四区视频免费观看| 毛片一区二区三区| 九九久久精品一区| 久久中文字幕精品| 国产又黄又猛又爽| 久久久蜜桃一区二区| 欧美黄色一级| 色菇凉天天综合网| 欧美国产日韩激情| 免费a级毛片在线播放| 99久久免费国产| 成人在线中文字幕| 青娱乐在线免费视频| 激情综合自拍| 欧美成人精品三级在线观看| 国产精品天天干| 国产精品玖玖玖在线资源| 狠狠入ady亚洲精品| 精品综合久久久久久8888| 久久久久日韩精品久久久男男| 国产白丝一区二区三区| 亚洲尤物av| 精品成人一区二区| 少妇性l交大片7724com| 国产一区二区三区四区五区3d| 黑人巨大精品欧美一区二区一视频 | 国产精品免费一区二区三区都可以 | 亚洲自拍偷拍另类| 日韩av中文在线观看| 97人人模人人爽人人喊中文字| 欧美被狂躁喷白浆精品| 亚洲大全视频| 久久精品国产视频| av一区二区三区免费观看| 成人在线视频一区二区三区| 日本精品久久久久| 粉嫩av亚洲一区二区图片| 成人在线免费观看视视频| 久久久久精彩视频| 男女性色大片免费观看一区二区| 久久亚洲综合av| 欧洲永久精品大片ww免费漫画| 久久亚洲精品大全| 中文字幕在线播| 国产乱人伦丫前精品视频| 欧美本精品男人aⅴ天堂| 两女双腿交缠激烈磨豆腐| 国产aa精品| 日韩视频一区在线观看| 日本黄色大片在线观看| 中文字幕久久精品一区二区| 精品美女在线播放| 私密视频在线观看| 在线日韩一区| 最近2019年好看中文字幕视频 | 午夜无码国产理论在线| 91福利在线导航| 波多结衣在线观看| 99精品女人在线观看免费视频| 777亚洲妇女| 九九九久久久久久久| 超碰成人在线免费| 亚洲久久久久久久久久久| 欧美 日韩 成人| 久久免费av| 久久综合免费视频| 日韩精品人妻中文字幕| 久久久久久亚洲精品杨幂换脸| 亚洲无线一线二线三线区别av| 亚洲精品久久7777777| 一本色道久久综合亚洲精品图片| 精品国产一区二区三区噜噜噜| xxxxx成人.com| 日韩激情一区二区三区| 久久中文字幕一区二区三区| 国产在线精品自拍| 日本韩国免费观看| 国产欧美va欧美不卡在线 | 99久久夜色精品国产亚洲狼| 欧美乱大交xxxxx另类电影| 久草国产精品视频| 另类调教123区| 官网99热精品| 国产天堂在线| 亚洲一区二区在线视频| 精品久久久噜噜噜噜久久图片| 激情不卡一区二区三区视频在线 | 美女欧美视频在线观看免费| 中文字幕日韩精品一区| av动漫在线看| 美女日韩一区| 尤物99国产成人精品视频| 久久精品国产亚洲av高清色欲 | 国内老熟妇对白xxxxhd| 久久伊99综合婷婷久久伊| 青青草免费在线视频观看| 亚洲伦乱视频| 日韩视频在线一区二区三区| 风间由美性色一区二区三区四区 | 中文字幕无线精品亚洲乱码一区 | 日韩欧美在线第一页| 中文字幕亚洲影院| 久草成人资源| 久久久久久久久久久成人| 一二三区在线播放| 久久久久久免费毛片精品| 国产美女永久无遮挡| 麻豆久久久久| 国产一区二区三区毛片| 在线观看亚洲天堂| 成人精品视频一区| 亚洲五码在线观看视频| 四虎4545www国产精品| 亚洲精品久久久久久久久久久久久 | 一区二区三区无毛| 亚洲视频一区二区三区| 国产成人亚洲精品自产在线| 国产iv一区二区三区| 日本精品免费视频| 欧美极品在线| 中文字幕亚洲二区| 国产成人自拍偷拍| 国产女同互慰高潮91漫画| 国产高清精品在线观看| 国产精品对白久久久久粗| 欧美激情a在线| 国产不卡av在线播放| 亚洲欧美韩国综合色| 久久久久xxxx| 888久久久| 成人妇女免费播放久久久| 色综合久久久久综合一本到桃花网| 日韩欧美亚洲成人| 中文字幕在线1| 快she精品国产999| 久久影视中文粉嫩av| 色多多在线观看| 亚洲免费一级电影| 无码无套少妇毛多18pxxxx| 久久久久久久久岛国免费| 国产日韩一区二区在线| 极品人妻一区二区三区| 福利欧美精品在线| 97在线视频免费观看| 色香蕉在线视频| 黑人精品xxx一区| 亚洲人成人无码网www国产| 日本最新不卡在线| 综合网五月天| 6080亚洲理论片在线观看| 久久久久久久国产| 全色精品综合影院| 欧美色精品在线视频| 黄色一级片一级片| jizz亚洲| 亚洲欧美另类日韩| 午夜精品一二三区| 亚洲欧美强伦一区二区| 无码精品人妻一区二区| 你懂的在线看| 午夜在线视频| 大胆人体一区| 欧美a级在线观看| kk眼镜猥琐国模调教系列一区二区| av女优在线播放| 丝袜连裤袜欧美激情日韩| 日韩av成人在线| 日韩伦理在线观看| 精品少妇一区二区三区免费观看 | 国产成人1区| 91精品国产综合久久男男| 日韩精品亚洲人成在线观看| 亚洲第一中文字幕在线观看| 色老头在线视频| 一区二区三区四区在线免费观看| 亚洲av无码一区二区三区观看| 日韩精品国产欧美| 久久久天堂国产精品| 曰本一区二区三区视频| 91亚洲午夜在线| 在线播放高清视频www| 操人视频在线观看欧美| 欧美婷婷久久五月精品三区| 欧美高清激情brazzers| 国产毛片aaa| 亚洲免费观看高清完整版在线观看| 亚洲精品第二页| 麻豆精品一区二区| 国产精品欧美一区二区三区| 成年人视频大全| 美女亚洲一区| 国产精品久久久久久久久婷婷| 欧美日韩成人影院| 欧美激情精品久久久久久大尺度| porn视频在线观看| 日韩电影在线观看中文字幕 | 欧美一区二区免费观在线| 亚洲视频 欧美视频| 一区二区三区在线播放| 女人十八毛片嫩草av| 99久久亚洲一区二区三区青草| 亚洲一区二区福利视频| 日韩电影一二三区| 波多野结衣乳巨码无在线| 欧美日本不卡高清| 亚洲第一综合网站| 日韩精品一区二区三区免费观影 | 高潮毛片7777777毛片| 欧美日韩国产一级片| 免费视频久久久| 亚洲成人av一区二区三区| 亚洲色婷婷一区二区三区| 国产精品久久久久影院老司| 日韩av在线看免费观看| aaa亚洲精品| 在线中文字日产幕| 国产精品99久久久久久久女警| 亚洲综合婷婷久久| 免费在线观看日韩欧美| 国产极品美女高潮无套久久久| 女同性一区二区三区人了人一| 亚洲福利av在线| 欧美久久综合网| 日韩欧美电影一区二区| 欧美极品在线观看| 欧美日本国产精品| 你微笑时很美电视剧整集高清不卡| 久久久久久久久一区二区| 麻豆精品免费视频| 男女做暖暖视频| 精品视频免费| 欧美一区二区三区在线免费观看| 嫩草国产精品入口| 色呦呦一区二区三区| 亚洲视频在线免费看| 美女一区视频| 一二三四视频在线中文| 992tv成人免费视频| 日本一级二级视频| 精品成人18| 亚洲午夜91| 成人av色在线观看| 成人国产精品久久| 热99在线视频| 豆国产97在线 | 亚洲| 欧美精彩视频一区二区三区| 日本综合在线观看| 国产精品久久一卡二卡| 顶臀精品视频www| 亚洲综合一二区| 日韩黄色精品视频| 日韩欧美中文第一页| 日本熟妇一区二区三区| 欧美美女激情18p| 国产成人三级在线播放| 精品国产露脸精彩对白 | 欧美人狂配大交3d怪物一区| 91福利免费视频| 日韩午夜三级在线| 亚洲av成人无码网天堂| 国产一区二区日韩| 超碰公开在线| 97在线视频精品| 国产69精品久久| 国产日韩欧美综合一区| 亚洲综合欧美在线| 国产99久久精品| 黄色性生活一级片| 亚洲国产高清在线| 久久免费精彩视频| 欧美午夜在线观看| www.好吊色| 亚洲人成在线一二| 91三级在线| 国产精品18久久久久久麻辣| 国产精品一区二区三区av| 精品国产乱码久久久久| 91视频久久| 免费成人午夜视频| 国产精品小仙女| 国产精品毛片一区二区| 亚洲一区日韩精品中文字幕| 国产女主播喷水视频在线观看| 日韩一区二区三区高清免费看看| 色鬼7777久久| 久久99精品久久久久久琪琪 | 亚洲午夜电影在线| 中文字幕在线播出| 亚洲精品国精品久久99热 | 亚洲欧洲成人av每日更新| 亚洲国产综合久久| 欧美日韩国产精选| 全部免费毛片在线播放网站| 色综合导航网站| 中文字幕系列一区| 久久天天狠狠| 国产精品magnet| 伊人成人222| 国产午夜精品一区二区三区视频| 国产一国产二国产三| 4438x亚洲最大成人网| 国产中文字幕在线视频| 668精品在线视频| 亚洲精品一区国产| 影音先锋成人资源网站| 美国一区二区三区在线播放| 强伦人妻一区二区三区| 午夜成人在线视频| 日本精品福利视频| 欧美freesextv| 久久精品午夜福利| 97久久精品人人澡人人爽| 激情五月少妇a| 91精品国产综合久久精品麻豆| 国产精品视频一区二区久久| 久久青草精品视频免费观看| 久久99成人| 男人j进女人j| 国产精品一区二区久久精品爱涩| 可以免费看av的网址| 欧美午夜精品电影| av在线资源站| 国产成+人+综合+亚洲欧美丁香花| 亚洲影院天堂中文av色| 男人靠女人免费视频网站| 99天天综合性| 在线观看国产亚洲| 亚洲精品成人久久久| 欧美少妇精品| 欧美人与性禽动交精品| 久久字幕精品一区| 91成人在线免费视频| 欧美综合天天夜夜久久| 国产高清在线| 国产精品三级网站| 婷婷亚洲最大| 亚洲国产综合av| 亚洲一区精品在线| 亚洲欧美日韩综合在线| 欧美中文字幕视频| 欧美日韩国产传媒| 91亚洲精品久久久蜜桃借种| 亚洲欧美激情在线| 成人福利小视频| 久久久久免费精品国产| 米奇精品关键词| 国产日韩一区二区在线观看| 国产欧美一区二区三区在线看蜜臀 | 亚洲人成无码网站久久99热国产 | 中文字幕日韩欧美在线视频| 天天操狠狠操夜夜操| 色综合一区二区日本韩国亚洲 | 国产亚洲精品中文字幕| 免费视频网站在线观看入口| 一区二区三区国产在线观看| 国产精品原创视频| 最新视频 - x88av| 成人激情久久| 亚洲欧美日韩另类| 丁香婷婷久久| 激情五月婷婷六月| 国产亚洲欧美日韩在线一区| 亚洲综合精品在线| 久久久久成人网| jvid福利在线一区二区| 人妻少妇偷人精品久久久任期| 亚洲国产日韩一级| 成人影视在线播放| 不卡视频一区二区三区| 久久香蕉精品| 日韩高清dvd碟片| 日韩黄色高清视频| 欧美性www| 日本十八禁视频无遮挡| 国产精品久久久久一区二区三区共 | 91看片淫黄大片91| 97久久人人超碰| 国产三级三级在线观看| 538国产精品一区二区免费视频 | 妞干网在线播放|