springboot打包目錄解析

一、引言

Java開發中我們使用最多的便是spring框架,比如springboot應用。微服務模式下,每個服務都是一個springboot應用,都會被打包成一個可執行jar包。那么我們有多少人嘗試去了解過這個可執行jar到底是什么?它的結構是什么樣的,我認為大部分人是沒有關注過這個的,今天筆者就通過探索的方式,揭開可執行jar的真面目。

二、打包項目

首先使用IDEA隨便創建一個spring web項目,打包一下看下target目錄
在這里插入圖片描述

classes

展開看到如下結構,主要是把我們自己寫的.java文件編譯成的.class文件和一些配置文件.yaml或者.properties,我們常說的classpath路徑,就是這個classes文件下的路徑。
在這里插入圖片描述

generated-sources

這個一般是用來存放框架或者工具自動生成的一些源碼或者文件的地方,比如注解Lombok等。
在這里插入圖片描述

generated-test-sources

這個沒什么好說的,用來存放生成一些測試代碼源或者文件的地方
在這里插入圖片描述

maven-archiver

aven-archiver是Maven內部使用的一個組件,它屬于org.apache.maven.archiver包,主要職責在于幫助Maven插件(如maven-jar-plugin, maven-war-plugin等)創建和管理歸檔文件(例如JAR, WAR, EAR等)。它處理諸如設置歸檔的元數據(如Manifest文件內容)、收集和歸檔項目資源和編譯后的類文件等工作。在這里插入圖片描述

maven-status

maven-status是Maven在構建過程中創建的一個臨時目錄,用于存儲構建期間的中間狀態信息。這個目錄的內容主要是由Maven的maven-build-number-plugin或maven-checkstyle-plugin等插件生成的,特別是那些需要跟蹤文件狀態的插件。
在這里插入圖片描述

surefire-reports

surefire-reports是Maven項目在執行單元測試時生成的測試報告目錄
在這里插入圖片描述

test-classes

這個就是測試類的生成目錄
在這里插入圖片描述
以上就是maven打包后的目錄解析說明,接下來的這兩個單獨的文件是重點
在這里插入圖片描述

三、可執行jar包

首先看這個.jar.original后綴的文件,
進入target目錄下,用360解壓縮解壓下original文件解壓到自己新建的original文件夾下
在這里插入圖片描述
使用IDEA查看,看到文件結構如下
在這里插入圖片描述
這個文件很小只有7kb,主要是應用的本地資源,并不包含第三方依賴。

再看.jar結尾的文件,這個就是我們打包好的可執行jar包,同樣的解壓到創建的jarExcutable文件中

在這里插入圖片描述
在IDEA中查看結構如下
在這里插入圖片描述

使用terminal控制臺,輸入tree
在這里插入圖片描述
這個文件結構相對來說就比較復雜了,解釋下關鍵部分

  • BOOT-INF/classes:存放的是應用編譯后的class文件
  • BOOT-INF/lib:這個存放的是我們引用的所有第三方jar包依賴
  • META-INF/:存放應用相關的元信息
  • org/:存放的是springboot相關的class文件

這個和標準的java EE web應用很相似,在java EE web應用中class文件放在WEB-INF/classes下,依賴的jar包就放在WEB-INF/lib下,二者很相似,其實spring很多東西是在java EE web基礎上發展而來。

java -jar yourapplicationName.jar命令可以啟動我們的jar包,那么為什么能啟動呢?打開這個MANIFEST.MF文件內容
在這里插入圖片描述
內容如下
在這里插入圖片描述

這個JarLauncher就是可執行JAR文件啟動器,是由以下插件spring-boot-maven-plugin追加進去的,JarLauncher是專門裝載引導類(啟動類)的
在這里插入圖片描述
pom文件中引入如下依賴(實際開發不需要引入,這里是為了看源碼)

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

JarLauncher源碼如下

/** Copyright 2012-2023 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      https://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package org.springframework.boot.loader.launch;/*** {@link Launcher} for JAR based archives. This launcher assumes that dependency jars are* included inside a {@code /BOOT-INF/lib} directory and that application classes are* included inside a {@code /BOOT-INF/classes} directory.** @author Phillip Webb* @author Andy Wilkinson* @author Madhura Bhave* @author Scott Frederick* @since 3.2.0*/
public class JarLauncher extends ExecutableArchiveLauncher {public JarLauncher() throws Exception {}protected JarLauncher(Archive archive) throws Exception {super(archive);}@Overrideprotected boolean isIncludedOnClassPath(Archive.Entry entry) {return isLibraryFileOrClassesDirectory(entry);}@Overrideprotected String getEntryPathPrefix() {return "BOOT-INF/";}static boolean isLibraryFileOrClassesDirectory(Archive.Entry entry) {String name = entry.name();if (entry.isDirectory()) {return name.equals("BOOT-INF/classes/");}return name.startsWith("BOOT-INF/lib/");}public static void main(String[] args) throws Exception {new JarLauncher().launch(args);}}

其中的BOOT-INF/lib/和BOOT-INF/classes/對應我們解壓jar包后的相關文件目錄,說明JarLauncher 會從中加載文件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15327.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15327.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15327.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2730. 找到最長的半重復子字符串(c++,滑動窗口)

給你一個下標從 0 開始的字符串 s &#xff0c;這個字符串只包含 0 到 9 的數字字符。 如果一個字符串 t 中至多有一對相鄰字符是相等的&#xff0c;那么稱這個字符串 t 是 半重復的 。例如&#xff0c;0010 、002020 、0123 、2002 和 54944 是半重復字符串&#xff0c;而 00…

Homebrew安裝、 Mac上pyenv的安裝與使用,復制黏貼搞定,網上教程看得眼花繚亂的來看看,簡單明了一步到胃!!

安裝 Homebrew /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"安裝pyenv brew install pyenv添加到終端使用的配置文件.zshrc、.bashrc 避免不必要的麻煩兩個終端的配置文件都進行添加&#xff0c;文件在當前用戶目…

第四十天 | 509.斐波那契數 70.爬樓梯 746.用最小花費爬樓梯

題目&#xff1a;509.斐波那契數 思路&#xff1a; 1.確定dp[i]含義&#xff1a;第i個斐波拉契數值為dp[i] 2.確定遞推公式&#xff1a;dp[i] dp[i - 1] dp[i - 2] 3.dp數組如何初始化&#xff1a;d[0] 1, dp[1] 1 4.遍歷順序&#xff1a;從前向后 5.打印dp class Soluti…

C語言代碼文件開頭需要的代碼

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>

淚目!網絡連接中斷的原因,終于找到了!

朋友們&#xff0c;出大事了&#xff01; 不知道多少朋友玩過 DNF 這個游戲&#xff0c;這個我從小學玩到大學的 “破” 游戲&#xff0c;昨天竟然出手游了&#xff01; 我都忘了自己曾幾何時預約過這個手游通知&#xff0c;昨天給我發了條通知信息說游戲已開服。 老玩家直接…

Gitee好用的瀏覽器插件【GiteeTree】

使用gitee的時候&#xff0c;可能拉到別人的項目后&#xff0c;只是想看下某些文件的代碼&#xff0c;但是不得不全部都拉下來&#xff0c;每次點又很麻煩。這個插件【GiteeTree】就很好用了&#xff0c;只需要搜索GiteeTree&#xff0c;然后把插件下載下來

git revert 和 git reset

文章目錄 工作區 暫存區 本地倉庫 遠程倉庫需求&#xff1a;已推送到遠程倉庫&#xff0c;想要撤銷操作git revert &#xff08;添加新的提交來“反做”之前的更改&#xff0c;云端會殘留上次的提交記錄&#xff09;git reset&#xff08;相當于覆蓋上次的提交&#xff09;1.--…

中國科學院植物研究所宋獻軍課題組揭示不同的翻譯后修飾協作調控水稻種子大小的新機制

公眾號&#xff1a;生信漫談&#xff0c;獲取最新科研信息&#xff01; 中國科學院植物研究所宋獻軍課題組揭示不同的翻譯后修飾協作調控水稻種子大小的新機制https://mp.weixin.qq.com/s/ycNgYzACwkYZbo6k0Zqtcw 未來20年&#xff0c;我國將決戰全面建成社會主義現代化國家&…

MySQL筆記第三天(從小白到入門)

文章目錄 MySQL筆記SQL語言介紹數據庫系統關系型數據庫非關系型數據庫SQL和數據庫系統的關系數據庫系統架構 MySQL的介紹概念MySQL的版本 MySQL的DDL操作-重點基本數據庫操作基本表操作 MySQL的DML操作-重點insert-插入數據update-更新數據delete-刪除數據 MySQL的約束-了解概述…

工廠生產管理系統

為應對一些國內驗廠&#xff0c;如大疆等&#xff0c;他們需要客戶有自己的生產管理系統的&#xff0c;但實際很多公司是沒有引入ERP這類的系統的&#xff0c;從而想開發一套簡單的生產管理系統。 參考了網上一個比較古老的StorageMange項目&#xff0c;此項目用到DevExpress的…

數字簽名:確保信息完整性和身份驗證的關鍵技術

在數字時代&#xff0c;信息的安全性和真實性變得至關重要。數字簽名作為一種電子形式的簽名&#xff0c;提供了一種驗證信息來源和確保信息完整性的方法。本文將深入探討數字簽名的概念、工作原理、應用場景以及它如何幫助提高網絡安全性。 數字簽名的概念 數字簽名是一種加密…

C++與Android處理16進制大端/小端數據實例(二百七十六)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

數據庫DCL語句

數據庫DCL語句 介紹&#xff1a; DCL英文全稱是Data Control Language(數據控制語言)&#xff0c;用來管理數據庫用戶、控制數據庫的訪 問權限。 管理用戶&#xff1a; 查詢用戶: select * from mysql.user;創建用戶: create user 用戶名主機名 identified by 密碼;修改用…

Go語言垃圾回收機制原理

1. 概述 垃圾回收是一種自動內存管理技術&#xff1a;通過檢測程序中不再使用的內存&#xff0c;并釋放這些內存供其他對象使用。 應用程序中會使用到兩種內存&#xff0c;分別為堆(Heap)和棧(Stack)。GC不負責回收棧內存&#xff0c;只負責回收堆內存。 函數執行完后&#xff…

《計算機網絡微課堂》課程概述

? 課程介紹 本專欄主要是 B 站課程《計算機網絡微課堂》的文字版&#xff0c;作者是湖南科技大學的老師。 B 站地址&#xff1a;https://www.bilibili.com/video/BV1c4411d7jb 該課程好評如潮&#xff0c;包含理論課&#xff0c;實驗課&#xff0c;考研真題分析課&#xf…

Jenkins在windows上進行安裝

今天為了實現jmeter接口測試腳本的持續性集成安裝了jenkins&#xff0c;主要記錄jenkins的安裝和端口的修改。 前提條件&#xff1a;安裝了jdk&#xff0c;我本機安裝的jdk1.8。 1.下載jenkins安裝包 安裝jenkins我們需要先下載安裝包&#xff0c;可以通過下面的鏈接進行下載&a…

10分鐘用QEMU搭建嵌入式開發環境學習Linux

安裝依賴軟件 作者的使用的是ubuntu22.04版本。 sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build sudo apt-get install git-email sudo apt-get install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-d…

JavaSE--基礎語法(第一期)

Java是一種優秀的程序設計語言&#xff0c;它具有令人賞心悅目的語法和易于理解的語義。不僅如此&#xff0c;Java還是一個有一系列計算機軟件和規范形成的技術體系&#xff0c;這個技術體系提供了完整的用于軟件開發和 跨平臺部署的支持環境&#xff0c;并廣泛應用于嵌入式系統…

基于Docker的ElasticSearch、Kibana服務搭建并開啟用戶鑒權

&#x1f3f7;?個人主頁&#xff1a;牽著貓散步的鼠鼠 &#x1f3f7;?系列專欄&#xff1a;云原生與服務部署專欄 &#x1f3f7;?個人學習筆記&#xff0c;若有缺誤&#xff0c;歡迎評論區指正 目錄 1. 前言 2. 服務搭建 2.1. 部署ElasticSearch 2.2. 部署Kibana 3. …

安全態勢管理的六大挑戰:態勢感知

德迅云安全鑒于如今的安全威脅不斷變幻&#xff0c;企業對實施態勢管理策略至關重要&#xff0c;可以讓安全團隊根據需要進行安全策略的動態調整。如果企業在研究構建態勢感知管理&#xff0c;需要特別關注以下六個方面的挑戰。 如果企業正在使用一個或多個平臺&#xff0c;那么…