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

spring-boot-maven-plugin插件打包和java -jar命令執(zhí)行原理分析

 更新時間:2025年05月07日 09:18:36   作者:Armyyyyy丶  
這篇文章主要介紹了spring-boot-maven-plugin插件打包和java -jar命令執(zhí)行原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1. Maven生命周期

Maven的生命周期有三種:

  1. clean:清除項目構建數(shù)據(jù),較為簡單,不深入探討;
  2. site:建立和部署項目站點,使用的較少,也不深入探討;
  3. default:定義了項目構建時所需要的所有步驟,是Maven生命周期中最核心最重要的的部分。

本次要深入了解的便是default流程。其生命周期如下:

階段可否執(zhí)行說明
validate驗證項目是否正確以及所有必要信息是否可用
initializeX初始化構建狀態(tài)
generate-sourcesX生成編譯階段需要的所有源碼文件
process-sourcesX處理源碼文件,例如過濾某些值
generate-resourcesX生成項目打包階段需要的資源文件
process-resourcesX處理資源文件,并復制到輸出目錄,為打包階段做準備
compile編譯源代碼,并移動到輸出目錄
process-classesX處理編譯生成的字節(jié)碼文件
generate-test-sourcesX生成編譯階段需要的測試源代碼
process-test-sourcesX處理測試資源,并復制到測試輸出目錄
test-compileX編譯測試源代碼并移動到測試輸出目錄中
test使用適當?shù)膯卧獪y試框架(如junit)運行測試
prepare-packageX在真正打包前執(zhí)行一些必要的操作
package獲取編譯后的代碼,并按照可發(fā)布的格式進行打包,如jar、war或ear文件
pre-integration-testX在集成測試執(zhí)行之前,執(zhí)行所需的操作,例如設置環(huán)境變量
integration-testX處理和部署所需的包到集成測試能夠運行的環(huán)境中
post-integration-testX在集成測試被執(zhí)行后執(zhí)行必要的操作,例如清理環(huán)境
verify對集成測試的結果進行檢查,以保證質量達標
install安裝打包的項目到本地倉庫,以供本地其它項目使用
deploy拷貝最終的包文件到遠程倉庫中,以共享給其它開發(fā)人員和項目

其中可以在Maven常見的Lifecycle中直接執(zhí)行的有validate、compile、test、package、verify和deploy七種,一般在Maven的plugin標簽中,可以通過配置如下配置來指定插件在某個階段生效,需要注意的是不可隨意配置,每個插件可處理的階段都是不同的。(不配置則執(zhí)行插件默認的)

<executions>
    <execution>
        <phase>XX</phase>
        <goals>
            <goal>XXXX</goal>
        </goals>
    </execution>
</executions>

今天要深入了解的spring-boot-maven-plugin插件就是在package階段中生效的。

2. jar包結構

通常而言,jar包分為可執(zhí)行jar包和不可執(zhí)行jar包,顧名思義,可執(zhí)行jar包即可通過命令java -jar直接執(zhí)行,不可執(zhí)行jar包通過命令java -jar執(zhí)行則會報錯。

2.1 不可執(zhí)jar包結構

|-- _jar包根目錄
    |-- 原項目class文件和resource文件
    |-- _META-INF
        |-- MANIFEST.MF
        |-- _maven
            |-- _項目目錄
                |-- pom.properties
                |-- pom.xml

上面是經(jīng)典的不可執(zhí)行jar包目錄,其中MANIFEST.MF文件內(nèi)容如下:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: xxxxx
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_151

這五項是最基本的,如果使用java -jar執(zhí)行這些jar包,將會拋出錯誤碼java.launcher.jar.error3,意為沒找到Main-Class屬性。不同語言展示的最終描述不同,由launcher+對應語言類轉換,簡體中文在launcher_zh_CN類中轉換,{0}為jar包名稱,內(nèi)容如下:

{0}中沒有主清單屬性

英文在launcher類中轉換,{0}為jar包名稱,內(nèi)容如下:

no main manifest attribute, in {0}

2.2 可執(zhí)行jar包結構

可執(zhí)行jar包結構挑選經(jīng)典的springboot啟動包來做示范:

|-- _jar包根目錄
    |-- _BOOT-INF
        |-- _classes
            |-- 原項目class文件和resource文件
        |-- _lib
            |--原項目依賴的jar庫文件
    |-- _META-INF
        |-- MANIFEST.MF
        |-- spring-configuration-metadata.json(springboot項目特有)
        |-- build-info.properties
        |-- _maven
            |-- _項目目錄
                |-- pom.properties
                |-- pom.xml

上一節(jié)我們得知了如果在MANIFEST.MF中沒有Main-Class屬性,使用java -jar命令執(zhí)行jar包會報錯,接下來看看在可執(zhí)行jar包的結構,MANIFEST.MF中具體有什么屬性:

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: XXXX
Implementation-Version: 1.0-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.1.6.RELEASE
Created-By: Maven Archiver 3.4.0
Start-Class: XXX.XXX.XXX.XXXX
Main-Class: org.springframework.boot.loader.JarLauncher

里面有兩個很重要的屬性:Start-ClassMain-Class,其中Start-Class指的是項目中springboot的SpringApplication啟動類,而Main-Class則是jar包的啟動類入口。

3. spring-boot-maven-plugin插件打包

springboot打包插件執(zhí)行原理:

  1. 讀取原jar包:Maven插件都能讀MavenProject對象內(nèi)容,從中可以讀取到Artifact信息,調用該對象的getFile()方法即可獲取原jar包文件對象;
  2. 讀取項目依賴jar庫:直接使用MavenProject對象的getArtifacts()方法即可獲取依賴的jar庫;
  3. 加載launchScript:讀取embeddedLaunchScript配置,并構建LaunchScript對象;
  4. 重新改寫MANIFEST.MF:到此步驟開始為repackage的核心流程,改寫清單文件時最主要的便是寫入Start-ClassMain-Class屬性,除此之外還會寫入jar庫和原項目文件目錄屬性;
  5. 寫入spring-boot-loader包文件:該包是springboot對接java -jar執(zhí)行命令的核心處理邏輯,springboot打包后加入的Main-Class: org.springframework.boot.loader.JarLauncher屬性指向的類便是此包中的jar包啟動類,如果war包則會寫入war包啟動類;
  6. 寫入原項目文件:原項目文件會被挪到BOOT-INF/classes/目錄下;
  7. 寫入項目依賴jar庫:原項目依賴的jar庫會被寫入到BOOT-INF/lib/目錄下。

如果要看spring-boot-maven-plugin插件打包源碼以分析原理,可導入插件的依賴,此時就能看到該插件的源碼。

如果使用的是IDEA,下載源碼后打上斷點,在執(zhí)行package時,使用debug模式啟動也能直接進行調試。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>XXXXX</version>
</dependency>

4. 執(zhí)行jar原理

將會分析執(zhí)行java -jar命令后,Java程序調用到Springboot啟動類main方法的流程。

  1. JVM啟動,執(zhí)行加載主函數(shù)LoadMainClass:此時是在JVM底層實現(xiàn)的,里面指定了LauncherHelper類;
  2. 執(zhí)行LauncherHelpercheckAndLoadMain方法:JVM將會調用LauncherHelpercheckAndLoadMain方法,解析并校驗jar包,并獲取主要的啟動類;
  3. 解析jar的MANIFEST.MF文件:在此方法中會完成讀取MANIFEST.MF文件,主要是讀取其中的Main-Class屬性,并做jar包啟動的校驗;
  4. GetStaticMethodID方法:JVM獲取到Main-Class類對象,調用Main-Class類對象的main方法;
  5. 執(zhí)行JarLauncher的main方法:JarLauncher繼承自Launcher,main方法最后還是會調用到Launcher.launch()方法中;
  6. 讀取jar的Start-Class:此時會讀取jar包的Start-Class屬性,該屬性就是原項目的SpringApplication啟動類;
  7. 調用啟動類的main方法:調用MainMethodRunner的run方法,里面會調用Start-Class類的main方法
  8. 此時調入到自定義的啟動類中,完成啟動Springboot程序的入口程序。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java后端用EL表達式改進JSP

    Java后端用EL表達式改進JSP

    EL 全名為Expression Language,EL的語法很簡單,它最大的特點就是使用上很方便,本文帶你用EL表達式改進JSP,感興趣的朋友來看看吧
    2022-02-02
  • java實現(xiàn)拼圖小游戲

    java實現(xiàn)拼圖小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)拼圖小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Java JDK動態(tài)代理實現(xiàn)原理實例解析

    Java JDK動態(tài)代理實現(xiàn)原理實例解析

    這篇文章主要介紹了Java JDK動態(tài)代理實現(xiàn)原理實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot中的自定義starter

    SpringBoot中的自定義starter

    這篇文章主要介紹了SpringBoot中的自定義starter,Starter是Spring?Boot中的一個非常重要的概念,Starter相當于模塊,它能將模塊所需的依賴整合起來并對模塊內(nèi)的Bean根據(jù)環(huán)境(條件)進行自動配置,需要的朋友可以參考下
    2024-01-01
  • java?時區(qū)時間轉為UTC的實現(xiàn)

    java?時區(qū)時間轉為UTC的實現(xiàn)

    Java提供了多種方式來實現(xiàn)時區(qū)時間轉換為UTC時間,包括使用java.util.Date和java.util.Calendar以及Java?8中新增的java.time包,下面就來介紹一下
    2024-08-08
  • Java中對象的序列化方式克隆詳解

    Java中對象的序列化方式克隆詳解

    在學習編程的過程中,我覺得不止要獲得課本的知識,更多的是通過學習技術知識提高解決問題的能力,這樣我們才能走在最前方。這篇文章主要給大家介紹了Java中對象的序列化方式克隆,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • Spring?Boot項目創(chuàng)建兩種方式的全流程

    Spring?Boot項目創(chuàng)建兩種方式的全流程

    Spring Boot是一款基于Spring Framework的開源框架,用于快速構建獨立的、可運行的、生產(chǎn)級的Spring應用程序,這篇文章主要介紹了Spring?Boot項目創(chuàng)建兩種方式的相關資料,需要的朋友可以參考下
    2025-09-09
  • SpringMVC的執(zhí)行過程淺析

    SpringMVC的執(zhí)行過程淺析

    這篇文章主要給大家介紹了關于SpringMVC的執(zhí)行過程的相關資料,文中通過圖文介紹的非常詳細,對大家的學習或者使用SpringMVC具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03
  • Java 8對LinkedHashSet元素進行排序的操作方法

    Java 8對LinkedHashSet元素進行排序的操作方法

    LinkedHashSet 是 Java 集合框架中的一個類,它繼承自 HashSet,并實現(xiàn)了 Set 接口,然而,LinkedHashSet 不支持元素的排序,它僅僅保持插入順序,所以本文給大家介紹了Java 8 如何對 LinkedHashSet 元素進行排序,需要的朋友可以參考下
    2024-11-11
  • 設置Log4j2監(jiān)控間隔的三種方法

    設置Log4j2監(jiān)控間隔的三種方法

    在 Log4j2 中,可以通過在配置文件中設置 monitorInterval 屬性來指定監(jiān)控配置文件變化的時間間隔,這個屬性告訴 Log4j2 每隔多少秒檢查一次配置文件是否有變化,本文介紹了具體的設置方法和示例,需要的朋友可以參考下
    2025-04-04

最新評論

祥云县| 垣曲县| 新安县| 蒲城县| 城市| 南江县| 新野县| 台安县| 绥芬河市| 万盛区| 乌拉特后旗| 湟源县| 寿光市| 裕民县| 云霄县| 三门峡市| 长海县| 济宁市| 石棉县| 河北区| 保定市| 白城市| 偃师市| 湘潭县| 都昌县| 朝阳市| 湖口县| 达尔| 拉萨市| 大兴区| 巍山| 阜南县| 共和县| 海淀区| 毕节市| 阿坝县| 金堂县| 绥棱县| 蓬安县| 陆川县| 霍邱县|