一、spring-boot-maven-plugin插件
SpringBoot項目生成可執行jar包是在maven項目的pom文件中加入了一個插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
該插件打出來的jar包是個fat jar,也就是包含了所有第三方依賴的jar包,該fat jar包中有除了java虛擬機以外的所有依賴,是個all-in-one jar包。
去target目錄下就能看到
這個read-spring-0.0.1-SNAPSHOT.jar就是個fat jar,用解壓工具能看到它的目錄結構如下
fat jar 目錄結構
├─BOOT-INF
│ ├─classes 這裏面是我們項目自己寫的代碼
│ └─lib 這裏面是maven pom.xml引用的所有的jar包
├─META-INF
│ ├─maven
│ ├─com.sid
│ ├─ read-spring
│ ├─ pom.properties
│ ├─ pom.xml
│ ├─MANIFEST.MF 下面會重點講到
└─org
└─springframework
└─boot
└─loader spring boot loader相關的代碼
├─archive
├─data
├─jar
└─util
└─JarLauncher.class 下面會重點講到
二、MANIFEST.MF文件
看一看該文件的內容:
Manifest-Version: 1.0
Implementation-Title: read-spring
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: 37024
Implementation-Vendor-Id: com.sid
Spring-Boot-Version: 1.5.8.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.sid.ReadSpringApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_221
Implementation-URL: http://projects.spring.io/spring-boot/read-spring/
裏面有兩個重要的屬性
1. Main-Class指向了JarLauncher,它是程序的啓動入口,即JarLauncher類中的main方法纔是程序的入口,在JarLauncher類中的main方法中利用反射調用定義好的Start-Class的main方法
2.Start-Class指向了SpringBoot項目中的啓動類,也就是有註解@SpringBootApplication修飾的那個類
對spring boot loader相關的代碼感興趣可以看看這兩篇介紹
SpringBoot源碼分析之SpringBoot可執行文件解析
徹底透析SpringBoot jar可執行原理