根目錄 |-- BOOT-INF
|-- classes
|-- lib |-- META-INF |-- org
- BOOT-INF 目錄
- classes 目錄中存放項目代碼對應的 .class文件
- lib 目錄中存放項目相關的依賴包,依賴包以 jar包 的方式存放(jar文件中存放jar文件,有個專門稱呼叫 “FatJar”
- META-INF
- 存放清單文件,其內容描述當前可執行 jar 包的基本信息
- 其中,有兩個主要的描述信息:
- Main-Class
-
描述 jar包 的入口文件(main 方法所在的類)
-
Spring 框架固定是
org.springframework.boot.loader.JarLauncher
-
定義完此屬性后,一定要有一個換行
-
- Start-Class
-
描述自定義 main 方法的全稱
-
- Main-Class
- org
-
存放了一些打包 SpringBoot 項目后的相關啟動類
-
由於 SpringBoot 基於管理及安全性的考慮,打包使用 “項目代碼與依賴包分離” 的方式(不同於以前將所有依賴包中的 .class 文件與項目的 .class 文件合並到一起的方式),因此打包后的 jar/war 包中依然包含了依賴的 jar 包,不符合 jar包 的規范,依賴的 jar包 無法通過默認的加載器進行加載
-
為了規避 jar文件規范,SpringBoot 使用自定義加載器去加載整個項目,於是入口就不再是編寫項目時的 main 方法,而是使用
org.springframework.boot.loader.JarLauncher
類,在啟動的時候創建自定義加載器去加載項目中的所有類 -
因此,打包后的 SpringBoot 項目,只有
org
文件夾中的類的類加載器是AppClassLoader
,BOOT-INF
文件夾中的類和依賴包的加載器是LaunchedURLClassLoader
-
war包的結構跟jar包結構差不多,只是多了幾個目錄(如 “WEB-INF/” 等)。