欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot程序的打包與運(yùn)行的實(shí)現(xiàn)

 更新時(shí)間:2022年06月28日 11:46:52   作者:不知名架構(gòu)師  
本文主要介紹了SpringBoot程序的打包與運(yùn)行的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

剛開始做開發(fā)學(xué)習(xí)的小伙伴可能在有一個(gè)知識(shí)上面有錯(cuò)誤的認(rèn)知,我們天天寫程序是在Idea下寫的,運(yùn)行也是在Idea下運(yùn)行的。

在這里插入圖片描述

但是實(shí)際開發(fā)完成后,我們的項(xiàng)目是不可能運(yùn)行在自己的電腦上的。

我們以后制作的程序是運(yùn)行在專用的服務(wù)器上的,簡(jiǎn)單說(shuō)就是將你做的程序放在一臺(tái)獨(dú)立運(yùn)行的電腦上,這臺(tái)電腦要比你開發(fā)使用的計(jì)算機(jī)更專業(yè),并且安全等級(jí)各個(gè)方面要遠(yuǎn)超過(guò)你現(xiàn)在的電腦。

那我們的程序如何放置在這臺(tái)專用的電腦上呢,這就要將我們的程序先組織成一個(gè)文件,然后將這個(gè)文件傳輸?shù)竭@臺(tái)服務(wù)器上。這里面就存在兩個(gè)過(guò)程,一個(gè)是打包的過(guò)程,另一個(gè)是運(yùn)行的過(guò)程。

溫馨提示

? 企業(yè)項(xiàng)目上線為了保障環(huán)境適配性會(huì)采用下面流程發(fā)布項(xiàng)目,這里不討論此過(guò)程。

  • 開發(fā)部門使用Git、SVN等版本控制工具上傳工程到版本服務(wù)器
  • 服務(wù)器使用版本控制工具下載工程
  • 服務(wù)器上使用Maven工具在當(dāng)前真機(jī)環(huán)境下重新構(gòu)建項(xiàng)目
  • 啟動(dòng)服務(wù)

繼續(xù)說(shuō)我們的打包和運(yùn)行過(guò)程。所謂打包指將程序轉(zhuǎn)換成一個(gè)可執(zhí)行的文件,所謂運(yùn)行指不依賴開發(fā)環(huán)境執(zhí)行打包產(chǎn)生的文件。上述兩個(gè)操作都有對(duì)應(yīng)的命令可以快速執(zhí)行。

程序打包

? SpringBoot程序是基于Maven創(chuàng)建的,在Maven中提供有打包的指令,叫做package。本操作可以在Idea環(huán)境下執(zhí)行。

mvn package

? 打包后會(huì)產(chǎn)生一個(gè)與工程名類似的jar文件,其名稱是由模塊名+版本號(hào)+.jar組成的。

image-20220619165405657

程序運(yùn)行

? 程序包打好以后,就可以直接執(zhí)行了。在程序包所在路徑下,執(zhí)行指令。

java -jar 工程包名.jar

? 執(zhí)行程序打包指令后,程序正常運(yùn)行,與在Idea下執(zhí)行程序沒有區(qū)別。

? 特別關(guān)注:如果你的計(jì)算機(jī)中沒有安裝java的jdk環(huán)境,是無(wú)法正確執(zhí)行上述操作的,因?yàn)槌绦驁?zhí)行使用的是java指令。

? 特別關(guān)注:在使用向?qū)?chuàng)建SpringBoot工程時(shí),pom.xml文件中會(huì)有如下配置,這一段配置千萬(wàn)不能刪除,否則打包后無(wú)法正常執(zhí)行程序。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

總結(jié)

  • SpringBoot工程可以基于java環(huán)境下獨(dú)立運(yùn)行jar文件啟動(dòng)服務(wù)
  • SpringBoot工程執(zhí)行mvn命令package進(jìn)行打包
  • 執(zhí)行jar命令:java –jar 工程名.jar

SpringBoot程序打包失敗處理

? 有些小伙伴打包以后執(zhí)行會(huì)出現(xiàn)一些問(wèn)題,導(dǎo)致程序無(wú)法正常執(zhí)行,例如下面的現(xiàn)象

要想搞清楚這個(gè)問(wèn)題就要說(shuō)說(shuō).jar文件的工作機(jī)制了,知道了這個(gè)東西就知道如何避免此類問(wèn)題的發(fā)生了。

搞java開發(fā)平時(shí)會(huì)接觸很多jar包,比如mysql的驅(qū)動(dòng)jar包,而上面我們打包程序后得到的也是一個(gè)jar文件。這個(gè)時(shí)候如果你使用上面的java -jar指令去執(zhí)行mysql的驅(qū)動(dòng)jar包就會(huì)出現(xiàn)上述不可執(zhí)行的現(xiàn)象,而我們的SpringBoot項(xiàng)目為什么能執(zhí)行呢?其實(shí)是因?yàn)榇虬绞讲灰粯印?/p>

在SpringBoot工程的pom.xml中有下面這組配置,這組配置決定了打包出來(lái)的程序包是否可以執(zhí)行。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

我們分別開啟這段配置和注釋掉這段配置分別執(zhí)行兩次打包,然后觀察兩次打包后的程序包的差別,共有3處比較明顯的特征

  • 打包后文件的大小不同
  • 打包后所包含的內(nèi)容不同
  • 打包程序中個(gè)別文件內(nèi)容不同

? 先看第一個(gè)現(xiàn)象,文件大小不同。帶有配置時(shí)打包生成的程序包大小如下:

不難看出,帶有配置的程序包體積比不帶配置的大了30倍,那這里面都有什么呢?能差這么多?下面看看里面的內(nèi)容有什么區(qū)別。

我們發(fā)現(xiàn)內(nèi)容也完全不一樣,僅有一個(gè)目錄是一樣的,叫做META-INF。打開容量大的程序包中的BOOT-INF目錄下的classes目錄,我們發(fā)現(xiàn)其中的內(nèi)容居然和容量小的程序包中的內(nèi)容完全一樣。

? 原來(lái)大的程序包中除了包含小的程序包中的內(nèi)容,還有別的東西。都有什么呢?回到BOOT-INF目錄下,打開lib目錄,里面顯示了很多個(gè)jar文件。

仔細(xì)翻閱不難發(fā)現(xiàn),這些jar文件都是我們制作這個(gè)工程時(shí)導(dǎo)入的坐標(biāo)對(duì)應(yīng)的文件。大概可以想明白了,SpringBoot程序?yàn)榱俗屪约捍虬傻某绦蚩梢元?dú)立運(yùn)行,不僅將項(xiàng)目中自己開發(fā)的內(nèi)容進(jìn)行了打包,還把當(dāng)前工程運(yùn)行需要使用的jar包全部打包進(jìn)來(lái)了。為什么這樣做呢?就是為了可以獨(dú)立運(yùn)行。不依賴程序包外部的任何資源可以獨(dú)立運(yùn)行當(dāng)前程序。這也是為什么大的程序包容量是小的程序包容量的30倍的主要原因。

再看看大程序包還有什么不同之處,在最外層目錄包含一個(gè)org目錄,進(jìn)入此目錄,目錄名是org\springframework\boot\loader,在里面可以找到一個(gè)JarLauncher.class的文件,先記得這個(gè)文件。再看這套目錄名,明顯是一個(gè)Spring的目錄名,為什么要把Spring框架的東西打包到這個(gè)程序包中呢?

回到兩個(gè)程序包的最外層目錄,查看名稱相同的文件夾META-INF下都有一個(gè)叫做MANIFEST.MF的文件,但是大小不同,打開文件,比較內(nèi)容區(qū)別

小容量文件的MANIFEST.MF

Manifest-Version: 1.0
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Build-Jdk-Spec: 1.8
Created-By: Maven Jar Plugin 3.2.0

大容量文件的MANIFEST.MF

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.itheima.SSMPApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.4
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher

? 大文件中明顯比小文件中多了幾行信息,其中最后一行信息是Main-Class: org.springframework.boot.loader.JarLauncher。這句話什么意思呢?如果使用java -jar執(zhí)行此程序包,將執(zhí)行Main-Class屬性配置的類,這個(gè)類恰巧就是前面看到的那個(gè)文件。原來(lái)SpringBoot打包程序中出現(xiàn)Spring框架的東西是為這里服務(wù)的。而這個(gè)org.springframework.boot.loader.JarLauncher類內(nèi)部要查找Start-Class屬性中配置的類,并執(zhí)行對(duì)應(yīng)的類。這個(gè)屬性在當(dāng)前配置中也存在,對(duì)應(yīng)的就是我們的引導(dǎo)類類名。

? 現(xiàn)在這組設(shè)定的作用就明白了:

  • SpringBoot程序添加配置后會(huì)打出一個(gè)特殊的包,包含Spring框架部分功能,原始工程內(nèi)容,原始工程依賴的jar包
  • 首先讀取MANIFEST.MF文件中的Main-Class屬性,用來(lái)標(biāo)記執(zhí)行java -jar命令后運(yùn)行的類
  • JarLauncher類執(zhí)行時(shí)會(huì)找到Start-Class屬性,也就是啟動(dòng)類類名
  • 運(yùn)行啟動(dòng)類時(shí)會(huì)運(yùn)行當(dāng)前工程的內(nèi)容
  • 運(yùn)行當(dāng)前工程時(shí)會(huì)使用依賴的jar包,從lib目錄中查找

看來(lái)SpringBoot打出來(lái)了包為了能夠獨(dú)立運(yùn)行,簡(jiǎn)直是煞費(fèi)苦心,將所有需要使用的資源全部都添加到了這個(gè)包里。這就是為什么這個(gè)jar包能獨(dú)立運(yùn)行的原因。

再來(lái)看之前的報(bào)錯(cuò)信息:

由于打包時(shí)沒有使用那段配置,結(jié)果打包后形成了一個(gè)普通的jar包,在MANIFEST.MF文件中也就沒有了Main-Class對(duì)應(yīng)的屬性了,所以運(yùn)行時(shí)提示找不到主清單屬性,這就是報(bào)錯(cuò)的原因。

總結(jié)

spring-boot-maven-plugin插件用于將當(dāng)前程序打包成一個(gè)可以獨(dú)立運(yùn)行的程序包

命令行啟動(dòng)常見問(wèn)題及解決方案

? 各位小伙伴在DOS環(huán)境下啟動(dòng)SpringBoot工程時(shí),可能會(huì)遇到端口占用的問(wèn)題。給大家一組命令,不用深入學(xué)習(xí),備用吧。

# 查詢端口
netstat -ano
# 查詢指定端口
netstat -ano |findstr "端口號(hào)"
# 根據(jù)進(jìn)程PID查詢進(jìn)程名稱
tasklist |findstr "進(jìn)程PID號(hào)"
# 根據(jù)PID殺死任務(wù)
taskkill /F /PID "進(jìn)程PID號(hào)"
# 根據(jù)進(jìn)程名稱殺死任務(wù)
taskkill -f -t -im "進(jìn)程名稱"

SpringBoot項(xiàng)目快速啟動(dòng)(Linux版)

? 其實(shí)對(duì)于Linux系統(tǒng)下的程序運(yùn)行與Windows系統(tǒng)下的程序運(yùn)行差別不大,命令還是那組命令,只不過(guò)各位小伙伴可能對(duì)Linux指令不太熟悉,結(jié)果就會(huì)導(dǎo)致各種各樣的問(wèn)題發(fā)生。比如防火墻如何關(guān)閉,IP地址如何查詢,JDK如何安裝等等。

到此這篇關(guān)于SpringBoot程序的打包與運(yùn)行的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot程序打包與運(yùn)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Mybatis中的 ${} 和 #{}區(qū)別與用法

    詳解Mybatis中的 ${} 和 #{}區(qū)別與用法

    這篇文章主要介紹了Mybatis中的 ${} 和 #{}區(qū)別與用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java獲取視頻時(shí)長(zhǎng)、大小的示例

    Java獲取視頻時(shí)長(zhǎng)、大小的示例

    這篇文章主要介紹了Java獲取視頻時(shí)長(zhǎng)、大小的示例,幫助大家利用Java處理視頻,完成需求,感興趣的朋友可以了解下
    2020-11-11
  • Springboot源碼 TargetSource解析

    Springboot源碼 TargetSource解析

    這篇文章主要介紹了Springboot源碼 TargetSource解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 詳解java裝飾模式(Decorator Pattern)

    詳解java裝飾模式(Decorator Pattern)

    這篇文章主要為大家詳細(xì)介紹了java裝飾模式Decorator Pattern,這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個(gè)包裝,對(duì)裝飾器模式感興趣的小伙伴們可以參考一下
    2016-04-04
  • 監(jiān)聽器獲取Spring配置文件的方法

    監(jiān)聽器獲取Spring配置文件的方法

    這篇文章主要為大家詳細(xì)介紹了監(jiān)聽器獲取Spring配置文件的方法,很實(shí)用的方法,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java Integer.ValueOf()的一些了解

    Java Integer.ValueOf()的一些了解

    這篇文章主要介紹了Java Integer.ValueOf()的一些了解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java并發(fā)工具類LongAdder原理實(shí)例解析

    Java并發(fā)工具類LongAdder原理實(shí)例解析

    這篇文章主要介紹了Java并發(fā)工具類LongAdder原理實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot中YAML配置文件實(shí)例詳解

    SpringBoot中YAML配置文件實(shí)例詳解

    前面一直在使用properties配置文件,spring boot也支持yaml配置文件,下面這篇文章主要給大家介紹了關(guān)于SpringBoot中YAML配置文件的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Spring cloud Feign 深度學(xué)習(xí)與應(yīng)用詳解

    Spring cloud Feign 深度學(xué)習(xí)與應(yīng)用詳解

    這篇文章主要介紹了Spring cloud Feign 深度學(xué)習(xí)與應(yīng)用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Java 并發(fā)編程:volatile的使用及其原理解析

    Java 并發(fā)編程:volatile的使用及其原理解析

    下面小編就為大家?guī)?lái)一篇Java 并發(fā)編程:volatile的使用及其原理解析。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05

最新評(píng)論