亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot項目部署到Linux服務器運行報錯怎么解決

發布時間:2022-03-02 10:09:13 來源:億速云 閱讀:727 作者:iii 欄目:web開發

這篇文章主要介紹“Spring Boot項目部署到Linux服務器運行報錯怎么解決”,在日常操作中,相信很多人在Spring Boot項目部署到Linux服務器運行報錯怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring Boot項目部署到Linux服務器運行報錯怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一 背景

最近在用 Springboot 開發項目 A,引了小伙伴開發的模塊 B,本地起服務,運行的好好的,等部署到服務器上,一運行就報錯:Caused by: java.lang.ClassNotFoundException。

注:導致該錯誤的原因有很多,比如:包沖突、類沖突、包不存在等,我這里只列舉其中一種情況,畢竟坑了我半天的時間,我覺得有必要分享出來。

二 原因

先看一個詭異的現象吧,我用別的工程 C 引用了同樣的依賴 B,部署到服務器上,運行的好好的,就我這個工程不行?細看:

1)工程 C 部署到服務器上,/app/C-service/lib 下的 jar包是:

B-api-1.0.0-20191224.024308-5.jar
B-dao-1.0.0-20191223.073120-2.jar

2)工程 C 部署到服務器上,/app/C-service/C-service.jar/META-INF/MANIFEST.MF,掃描路徑是:

lib/B-api-1.0.0-20191224.024308-5.jar
lib/B-dao-1.0.0-20191223.073120-2.jar

而:

1)我的工程 A 部署到服務器上,/app/A-service/lib 下的 jar包是:

B-api-1.0.0-SNAPSHOT.jar
B-dao-1.0.0-SNAPSHOT.jar

2)我的工程 A 部署到服務器上,/app/A-service/A-service.jar/META-INF/MANIFEST.MF,掃描路徑是:

lib/B-api-1.0.0-20191224.024308-5.jar
lib/B-dao-1.0.0-20191223.073120-2.jar

發現:MANIFEST.MF 中掃描的 jar 包路徑和實際解壓出來的 jar 包名稱不一致(一個帶時間戳,一個是 SNAPSHOT),所以掃描不到 jar 包,導致報錯:Caused by: java.lang.ClassNotFoundException。

那么是什么原因構成了這樁慘案呢?機緣巧合:

1.我小伙伴的模塊,deploy 時用的是 SNAPSHOT,如 1.0.0-SNAPSHOT,我在拉取 jar包時,拉到的是:B-api-1.0.0-20191224.024308-5.jar:

<dependency>
    <groupId>com.xxx.xxx</groupId>
    <artifactId>B-api</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

2.我的工程 A 本地可以跑,是因為那時候我沒有打包 mvn clean package -Dmaven.test.skip=true,IDEA 本地運行項目時 jar 包掃描路徑 和 實際拉取的 jar 包一致;當我打包后,解壓出 A-service.zip 包,本地運行同樣會報錯;

3.問題在于工程 A 打包前后的區別,為什么打包后:MANIFEST.MF 和 A-service.zip 解壓后的 lib/ 目錄下的 jar包 名稱不一致?

4.最后通過比較工程 C 的配置文件和 A 的配置文件,找到不同點:A工程的 assembly.xml 中多了一行:<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>

<dependencySets>
    <dependencySet>
       <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>
        <useProjectArtifact>false</useProjectArtifact>
        <outputDirectory>lib</outputDirectory>
    </dependencySet>
</dependencySets>

5.把這行去掉,問題確實解決了。但是為什么呢?拉下來的 jar 包、MANIFEST.MF 中掃描的 jar包帶時間戳,總覺得不夠清秀、哪里不對勁。隨后我以 outputFileNameMapping 為字眼找了下相關資料,果然找到了另外一位老大哥:<useUniqueVersions>false</useUniqueVersions> ,這行配置是放在工程的 Service 模塊(Application.java 啟動類所在模塊)的 pom.xml 中:

<!-- 打包jar文件時,配置manifest文件,加入lib包的jar依賴 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>${main.class}</mainClass>
                <useUniqueVersions>false</useUniqueVersions>
            </manifest>
        </archive>
        <excludes>
            <exclude>*.yml</exclude>
            <exclude>*.properties</exclude>
        </excludes>
    </configuration>
</plugin>

6.解釋:

1)<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>,作用是在你打包的時候:lib/ 下的 jar 包可以重命名,比如本來應該是 B-api-1.0.0-20191224.024308-5.jar,通過這行配置后,jar包被重命名為:B-api-1.0.0-SNAPSHOT.jar;

2)<useUniqueVersions>false</useUniqueVersions>,作用是在你生成 MANIFEST.MF 文件時,lib/ 下的 jar包如果版本是 xxx-SNAPSHOT,要不要帶唯一版本時間戳,如果你配置為 false(默認為 true),那么本來應該是 B-api-1.0.0-20191224.024308-5.jar,通過這行配置后,jar包被重命名為:B-api-1.0.0-SNAPSHOT.jar;

剛好:

1)工程 C 中 outputFileNameMapping,useUniqueVersions 都沒配置,使用默認值,使得 lib/ 下的 jar包名稱 和 MANIFEST.MF 下的掃描路徑 jar包名稱一致(都帶時間戳);

2)而我的工程 A,不只從哪里拷貝來的配置文件,配了 outputFileNameMapping (沒帶時間戳),但沒配置 useUniqueVersions(帶時間戳),導致不一致;

所以:這兩個配置,要么都有,要么都沒有,不然就會出現不一致,導致報錯。

三 解決

我個人覺得,jar 包名稱還是不帶時間戳更清秀些,所以我推薦 outputFileNameMapping,useUniqueVersions 都配置上,如下:

1.assembly.xml 中添加配置:<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>

<dependencySets>
    <dependencySet>
        <outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>
        <useProjectArtifact>false</useProjectArtifact>
        <outputDirectory>lib</outputDirectory>
    </dependencySet>
</dependencySets>

2.啟動類 Application.java 所在模塊的 pom.xml 中添加配置:<useUniqueVersions>false</useUniqueVersions>

<!-- 打包jar文件時,配置manifest文件,加入lib包的jar依賴 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>${main.class}</mainClass>
                <useUniqueVersions>false</useUniqueVersions>
            </manifest>
        </archive>
        <excludes>
            <exclude>*.yml</exclude>
            <exclude>*.properties</exclude>
        </excludes>
    </configuration>
</plugin>

到此,關于“Spring Boot項目部署到Linux服務器運行報錯怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

康乐县| 景洪市| 黄平县| 岗巴县| 丰都县| 桂东县| 尤溪县| 宁晋县| 三原县| 启东市| 武威市| 宜州市| 博野县| 珠海市| 恩施市| 孝义市| 云和县| 兴安县| 霍邱县| 湘潭县| 皋兰县| 周口市| 天柱县| 陆川县| 桃源县| 潮安县| 繁昌县| 九江市| 屯留县| 卓尼县| 聊城市| 阜宁县| 大丰市| 改则县| 涟水县| 嘉义县| 洱源县| 原平市| 中宁县| 虎林市| 台南县|