問題背景
先說一下背景:
其一,公司使用的雲主機,無法連接外網,所以無法直接創建SpringBoot項目!
其二,我是🐷,這是用來記錄自己蠢到家的一篇文章
最近在工作中的一個新項目遇到了SpringBoot打jar包到服務器上無法執行,打包的時候就感覺jar包也太小了吧,而且還沒有xxx.jar.original的文件同時生成,而且一運行就提示沒有主類的問題
no main manifest attribute, in xxx.jar
下圖爲我在mac上運行的結果,爲了問題重現而已,在linux會報最上面一行的錯誤,意思都是一樣的
但是在本地Idea中可以正常運行,而且,講道理來說SpringBoot項目打包明明可以直接運行,而且之前SpringBoot項目也是這麼運行的都沒問題啊,爲啥服務器上運行就找不到主類呢?
真的是百思不得其姐,於是百度了一下,發現了幾種解決辦法:
解決方法一(PASS)
使用 java -cp jar包位置 啓動類全類名 ,如:
java -cp /data/testDemo.jar com.rayacai.Application
但是這也只能臨時的指定路徑讓項目跑起來,這明明已經是另一種啓動方式了,並沒有徹底解決
再說,我也不可能將一個“正常”的SpringBoot項目以這種方式來進行每次服務器的部署啊!
於是,又開始尋找另一個方法…
解決方法二(PASS)
在某一篇文章裏找到了這段代碼,於是被我直接拉了過來
想在本地試一下,結果…直接原地爆炸!
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.sf.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
發生了什麼情況呢?
我的程序maven依賴包錯,刪除此build標籤後,依賴不報錯了,可以clean,但是無法package,發現是編譯問題
於是我的項目現在連build/rebuild重新編譯都無法通過
報錯找不到所有的mapper的xml文件
再到文件夾中查看,target文件夾拒絕訪問,無法刪除
心想,完了,這特麼弄個主類把項目都弄炸了還得重新從svn上拉下來再把新代碼搞過去
後來想着死馬當活馬醫,重啓一下吧
target無法刪除問題解決!!!!!!
重啓後,那個無法刪除的target文件夾已經自動消失了,可以編譯和正常啓動了,這段代碼也就沒敢再試,PASS!
解決方法三(BINGO)
這時候陷入了僵局
開始和其他SpringBoot項目比對<dependency>,因爲是手動maven創建的項目,之後才引入的SpringBoot的相關依賴,所以總以爲是依賴少引入了
後來想到的是少寫註解啥的了,又開始找註解的問題…
其實在這個過程中有發現jar包中的META-INF文件夾下的MANIFEST.MF中沒有主類MainClass,但是沒有找到原因,爲什麼會沒有…
後來突然想到方法二的build標籤思路是不是對的?
就比對了其他SpringBoot項目中的pom.xml才發現,原來SpringBoot項目是要有build標籤的
但是內容只有這幾行
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
看到這我也知道自己蠢,爲啥沒早進行比對呢
其實我也早對比了,但是就沒想到build這塊,一直在對比依賴部分
(好吧,其實我就是蠢!!!)
加上這個build標籤後,該有的東西都有了,完美解決!!!!
後記
對於SpringBoot平時對於自己寫練習的時候都是插件直接聯網在線創建,而且在公司裏也都是在現有項目中進行業務邏輯開發,不會說用maven手動搭建SpringBoot的項目
像我們這種開發環境禁止聯網只能手動創建maven新項目再引入SpringBoot依賴的情況也是極少數了
但是,這次也是給個教訓,記一下SpringBoot的基本框架最基本需要哪些東西,不要各種框架、插件用多了,忘記了最基本的構建方式和結構了。