91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Spring Boot 中啟動java -jar命令

發布時間:2021-05-26 10:14:10 來源:億速云 閱讀:616 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關怎么在Spring Boot 中啟動java -jar命令,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

jar包目錄和jar命令啟動入口

在正式開始之前,我們先來看看把jar包進行解壓。然后用tree /f命令查看目錄結構(由于筆者寫博文時用的是window,所以用的是tree /f命令),由于目錄結構太長,這里做了相應省略,如下:

├─BOOT-INF
│ ├─classes
│ │ │ application.properties
│ │ │
│ │ └─com
│ │   └─spring
│ │     └─boot
│ │       └─test
│ │           SpringBootTestApplication.class
│ │
│ └─lib
│     classmate-1.5.1.jar
│     hibernate-validator-6.0.18.Final.jar
│     …………此處省略…………
│
├─META-INF
│ │ MANIFEST.MF
│ │
│ └─maven
│   └─com.spring.boot.test
│     └─spring-boot-test
│         pom.properties
│         pom.xml
│
└─org
  └─springframework
    └─boot
      └─loader
        │ ExecutableArchiveLauncher.class
        │ JarLauncher.class
        │ LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.class
        │ LaunchedURLClassLoader.class
        │ Launcher.class
        │ MainMethodRunner.class
        │ PropertiesLauncher$1.class
        │ PropertiesLauncher$ArchiveEntryFilter.class
        │ PropertiesLauncher$PrefixMatchingArchiveFilter.class
        │ PropertiesLauncher.class
        │ WarLauncher.class
        │
        ├─archive
        │   Archive$Entry.class
        │   …………此處省略…………
        │
        ├─data
        │   RandomAccessData.class
        │   …………此處省略…………
        │
        ├─jar
        │   AsciiBytes.class
        │   Bytes.class
        │   …………此處省略…………
        │
        └─util
            SystemPropertyUtils.class

先簡單說下上面目錄結構,大體目錄分三層:BOOT-INF、META-INF、org,BOOT-INF是存放對應的應用服務的.class文件和Maven依賴的jar包,包括啟動類SpringBootTestApplication,META-INF下存放的是Maven相關的pom信息和MANIFEST.MF文件,org文件夾下存放的是Spring boot loader模塊編譯的.class文件,也就是jar啟動的關鍵代碼所在。

在執行java -jar命令的時候,它的啟動類配置實在jar包目錄下META-INF文件夾下的名MANIFEST.MF文件中,在這個文件中有一個名為Main-Class的屬性,我們來看下這個文件的具體內容:

Manifest-Version: 1.0
Implementation-Title: spring-boot-test
Implementation-Version: 0.0.1-SNAPSHOT
Start-Class: com.spring.boot.test.SpringBootTestApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.2.3.RELEASE
Created-By: Maven Archiver 3.4.0
Main-Class: org.springframework.boot.loader.JarLauncher

從上面的配置文件中,可以看到Main-Class屬性指向的Class為org.springframework.boot.loader.JarLauncher,而JarLauncher是JAR的啟動器,這個類是在org/springframework/boot/loader/,然后可以看到項目所定義的啟動類是指向Start-Class這個屬性的。

JAR文件啟動器——JarLauncher

在上面我們說了JarLauncher是JAR可執行的啟動器,那么它和項目的啟動類SpringBootTestApplication有什么關聯呢?先給大家來個示例,先來到解壓目錄下執行命令:java org.springframework.boot.loader.JarLauncher ,然后便是如下界面:

C:\Users\elisha\Desktop\spring-boot-test-0.0.1-SNAPSHOT>java org.springframework.boot.loader.JarLauncher
 
 .  ____     _      __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::    (v2.2.3.RELEASE)
2020-01-18 14:28:19.866 INFO 3644 --- [      main] c.s.boot.test.SpringBootTestApplication : Starting SpringBootTestApplication on LAPTOP-R2NNI9CM with PID 3644 (C:\Users\elisha\Desktop\spring-boot-test-0.0.1-SNAPSHOT\BOOT-INF\classes started by elisha in C:\Users\elisha\Desktop\spring-boot-test-0.0.1-SNAPSHOT)

從上面的執行接口可以看到項目引導類SpringBootTestApplication會被JarLauncher類進行引導,但是如果我們到BOOT-INF/class目錄下,然后也執行java  com.spring.boot.test.SpringBootTestApplication,會報SpringApplication的ClassNotFoundException這個錯誤,由此可以得知這是因為java命令未指定Class Path。不過當前Spring Boot依賴的JAR文件都是存放在BOOT-INF/lib下,而org.springframework.boot.loader.JarLauncher會將JAR作為SpringBootTestApplication類庫的依賴,這也就是為什么JarLauncher能引導SpringBootTestApplication,反之則是不可以的,那么對于SpringBootTestApplication是JarLauncher的子進程,還是處于同一層級呢?接下來我們來看看JarLauncher的原理。

JarLauncher實現引導原理

因為org.springframework.boot.loader.JarLauncher的類是在spring-boot-loader中,但是若想在IDEA中來看源碼,需要在pom文件中引入如下配置:

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

在引入上面的配置文件后,便可以在IDEA中查看源碼了,使用CTRL+N命令來搜索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 {
 new JarLauncher().launch(args);
 }
 
}

從上面的JarLauncher類中,可以看到兩個常量:BOOT_INF_CLASSES、BOOT_INF_LIB,而它們又分別指向如下路徑:BOOT-INF/classes/、BOOT-INF/lib/,并用isNestedArchive(Archive.Entry entry)方法進行判斷(在Spring Boot中Archive,抽象出了Archive的概念,一個Archive可以是一個Jar(JarFileArchive)、也可以是一個目錄(ExplodedArchive),在這里可以理解為Spring  Boot抽象出來的同一訪問資源層。),從isNestedArchive方法的參數Archive.Entry對象貌似為一個JAR文件中的資源,譬如application.properties,同時這個對象和JarEntry是類似的,其name屬性(Archive.Entry#getName())便是Jar資源的相對路徑。當application.properties資源在FAT JAR目錄下時,其實Archive.Entry#getName()就是/BOOT-INF/classes/application.properties,此時便符合startsWith方法的判斷,所以isNestedArchive(Archive.Entry entry)便返回為true。當返回為false時,便說明FAT JAR被解壓到文件目錄了,由此也說明了Spring Boot應用可以通過java org.springframework.boot.loader.JarLauncher 命令啟動的原因了。

Archive.Entry的實現

上面說了在Spring Boot中Archive,抽象出了Archive的概念,一個Archive可以是一個Jar(JarFileArchive)、也可以是一個目錄(ExplodedArchive),這里所說的JarFileArchive、ExplodedArchive便是Archive的兩種是想方式,對于這兩個類的實現代碼感興趣額同學可以自己去看看。

不過由此也說明了JarLauncher  既支持JAR啟動,又支持文件系統啟動。同時JarLauncher 在作為引導類的時候,當執行java -jar 命令式,/META-INF/ 下MANIFEST.MF文件中的Main-Class屬性將調用它的,main(String [])方法,其實它還是調用JarLauncher #launch(args)方法,這個方法是實現基類Launcher,這里簡單看下這個方法的實現:

protected void launch(String[] args) throws Exception {
 JarFile.registerUrlProtocolHandler();
 ClassLoader classLoader = createClassLoader(getClassPathArchives());
 launch(args, getMainClass(), classLoader);
}

springboot是什么

springboot一種全新的編程規范,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程,SpringBoot也是一個服務于框架的框架,服務范圍是簡化配置文件。

上述就是小編為大家分享的怎么在Spring Boot 中啟動java -jar命令了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永定县| 泌阳县| 达州市| 平度市| 三台县| 夹江县| 如东县| 陵水| 夏邑县| 双辽市| 周至县| 常山县| 宁河县| 名山县| 龙井市| 石河子市| 宜城市| 观塘区| 当阳市| 兴海县| 介休市| 奉新县| 铜鼓县| 阳信县| 招远市| 绥宁县| 兰西县| 凤阳县| 讷河市| 临夏市| 天等县| 建始县| 江源县| 武威市| 河南省| 石河子市| 柳江县| 朝阳县| 基隆市| 桐乡市| 丹巴县|