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

SpringBoot程序打包失敗(.jar中沒有主清單屬性)

 更新時(shí)間:2023年06月28日 09:49:43   作者:小小孫十八  
在學(xué)習(xí)SpringBoot,打包SpringBoot程序后,在cmd運(yùn)行出現(xiàn)了 某某某.jar中沒有注清單屬性,本文就來介紹一下原因以及解決方法,感興趣的可以了解一下

最近在學(xué)習(xí)SpringBoot,打包SpringBoot程序后,在cmd運(yùn)行出現(xiàn)了 某某某.jar中沒有注清單屬性 。

image-20211201094223991.png

我當(dāng)時(shí)也是很懵逼,就去萬能的互聯(lián)網(wǎng)尋求幫助,累計(jì)找了大概十幾篇文章吧,最后總算是在一個(gè)網(wǎng)友的評論中得到了答案,在此先感謝那位留下評論的熱心網(wǎng)友。

我的錯(cuò)誤

說明一下,我的SpringBoot模板是基于aliyun鏡像創(chuàng)建的。

在默認(rèn)給出的配置的環(huán)境下,pom.xml中是有spring-boot-maven-plugin這個(gè)依賴的,所以可以先排除沒有這個(gè)依賴的說法。

我用maven打包后,只給出了一個(gè)內(nèi)存較小的jar文件,運(yùn)行這個(gè)文件,就會(huì)出現(xiàn)上述沒有主屬性清單的錯(cuò)誤,至于這個(gè)jar文件為何會(huì)出現(xiàn)這個(gè)錯(cuò)誤,我會(huì)在文章的下面講。

在看到這位熱心網(wǎng)友的評論時(shí),我也不明白是因?yàn)槭裁?,根?jù)TA的說法,我更改的默認(rèn)的配置,唉,成了,在打包后出現(xiàn)了兩個(gè)jar。

image-20211201095610270.png

運(yùn)行那個(gè)內(nèi)存占用較大的jar,運(yùn)行成功(喜)。而為什么要運(yùn)行占用內(nèi)存較大的呢,也在后文做解釋。

解決方法

我的解決方案:

對pom.xml文件做如下修改

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-compiler-plugin</artifactId>
                   <version>3.8.1</version>
                   <configuration>
                       <source>1.8</source>
                       <target>1.8</target>
                       <encoding>UTF-8</encoding>
                   </configuration>
		</plugin>
		<plugin>
			<groupId>org.springframework.boot</groupId>
                   <artifactId>spring-boot-maven-plugin</artifactId>
                   <version>${spring-boot.version}</version>
                   <!-- 把這里給刪除就可以打包成功 -->
                   <!--<configuration>
                       <mainClass>com.sun.SSMPApplication</mainClass>
                       <skip>true</skip>
                   </configuration>-->
                   <executions>
                       <execution>
                           <id>repackage</id>
                           <goals>
                               <goal>repackage</goal>
                           </goals>
                       </execution>
                   </executions>
         </plugin>
	</plugins>
</build>

錯(cuò)誤分析

要想搞清楚這個(gè)問題就要說說.jar文件的工作機(jī)制了,知道了這個(gè)東西就知道如何避免此類問題的發(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>

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

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

1、打包后文件的大小不同

2、打包后所包含的內(nèi)容不同

3、打包程序中個(gè)別文件內(nèi)容不同

大小不同

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

image-20211201095610270.png

包含內(nèi)容不同

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

image-20211201101541267.png

image-20211201101652868.png

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

image-20211201101805569.png

image-20211201101652868.png

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

image-20211201102025791.png

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

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

個(gè)別文件內(nèi)容不同

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

小容量文件的MANIFEST.MF

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: 名字
Created-By: Apache Maven 3.8.1
Build-Jdk: 1.8.0_201

大容量文件的MANIFEST.MF

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Archiver-Version: Plexus Archiver
Built-By: 名字
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.sun.SSMPApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.6.13
Created-By: Apache Maven 3.8.1
Build-Jdk: 1.8.0_201
Main-Class: org.springframework.boot.loader.JarLauncher

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

  • SpringBoot程序添加配置后會(huì)打出一個(gè)特殊的包,包含Spring框架部分功能,原始工程內(nèi)容,原始工程依賴的jar包
  • 首先讀取MANIFEST.MF文件中的Main-Class屬性,用來標(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目錄中查找

SpringBoot打出來了包為了能夠獨(dú)立運(yùn)行,將所有需要使用的資源全部都添加到了這個(gè)包里。這就是為什么這個(gè)jar包能獨(dú)立運(yùn)行的原因。

總結(jié)

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

image-20211201094223991.png

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

到此這篇關(guān)于SpringBoot程序打包失敗(.jar中沒有主清單屬性)的文章就介紹到這了,更多相關(guān)SpringBoot程序打包失敗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中ArrayList和LinkedList的區(qū)別

    Java中ArrayList和LinkedList的區(qū)別

    ArrayList和LinkedList在這個(gè)方法上存在一定的性能差異,本文就介紹了Java中ArrayList和LinkedList的區(qū)別,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • JavaWeb中異步交互的關(guān)鍵Ajax詳解

    JavaWeb中異步交互的關(guān)鍵Ajax詳解

    這篇文章主要給大家介紹了關(guān)于JavaWeb中異步交互關(guān)鍵Ajax的相關(guān)資料,在javaweb中,ajax是前后臺(tái)交互的技術(shù),可以實(shí)現(xiàn)異步請求,不用刷新整個(gè)頁面就可以完成操作,需要的朋友可以參考下
    2023-07-07
  • Spring Boot基礎(chǔ)學(xué)習(xí)之Mybatis操作中使用Redis做緩存詳解

    Spring Boot基礎(chǔ)學(xué)習(xí)之Mybatis操作中使用Redis做緩存詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot基礎(chǔ)學(xué)習(xí)之Mybatis操作中使用Redis做緩存的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧
    2018-11-11
  • SpringBoot框架搭建教程分享

    SpringBoot框架搭建教程分享

    這篇文章主要為大家詳細(xì)介紹了SpringBoot框架搭建教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java中Bean轉(zhuǎn)Map問題歸納總結(jié)

    Java中Bean轉(zhuǎn)Map問題歸納總結(jié)

    Java Bean轉(zhuǎn)Map的坑很多,最常見的就是類型丟失和屬性名解析錯(cuò)誤的問題,下面這篇文章主要給大家介紹了關(guān)于Java中Bean轉(zhuǎn)Map問題歸納總結(jié)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • springboot 獲取工具類bean過程詳解

    springboot 獲取工具類bean過程詳解

    這篇文章主要介紹了springboot 獲取工具類bean過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解Spring Boot中PATCH上傳文件的問題

    詳解Spring Boot中PATCH上傳文件的問題

    這篇文章主要介紹了詳解Spring Boot中PATCH上傳文件的問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • Springboot使用@RefreshScope注解實(shí)現(xiàn)配置文件的動(dòng)態(tài)加載

    Springboot使用@RefreshScope注解實(shí)現(xiàn)配置文件的動(dòng)態(tài)加載

    本文主要介紹了Springboot使用@RefreshScope注解實(shí)現(xiàn)配置文件的動(dòng)態(tài)加載,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java實(shí)現(xiàn)Kafka生產(chǎn)者消費(fèi)者代碼實(shí)例

    Java實(shí)現(xiàn)Kafka生產(chǎn)者消費(fèi)者代碼實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)Kafka生產(chǎn)者消費(fèi)者代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • StringUtils里的isEmpty方法和isBlank方法的區(qū)別詳解

    StringUtils里的isEmpty方法和isBlank方法的區(qū)別詳解

    這篇文章主要介紹了StringUtils里的isEmpty方法和isBlank方法的區(qū)別詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2020-04-04

最新評論