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

一次Spring項(xiàng)目打包問(wèn)題排查的實(shí)戰(zhàn)記錄

 更新時(shí)間:2020年08月21日 09:34:52   作者:掘墓人4449  
這篇文章主要給大家介紹了一次Spring項(xiàng)目打包問(wèn)題排查的實(shí)戰(zhàn)記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一個(gè) Spring 項(xiàng)目,打成 jar 包之后運(yùn)行,在有網(wǎng)絡(luò)的時(shí)候是正常的,但是一旦無(wú)網(wǎng)絡(luò)就會(huì)報(bào)錯(cuò),具體是怎么回事呢?這篇文章就來(lái)記錄下這次問(wèn)題排查經(jīng)過(guò)。

背景介紹

一個(gè)圖形化的界面,帶本地?cái)?shù)據(jù)庫(kù),要求可以在無(wú)網(wǎng)絡(luò)環(huán)境下運(yùn)行,我?guī)团笥延玫?Java 寫(xiě)的圖形化界面,雖然不是很美觀,但是勝在熟悉 Java。

項(xiàng)目使用的是 idea 的「Build Artifacts」打包,打包之后運(yùn)行正常,界面和數(shù)據(jù)庫(kù)訪問(wèn)都正常,最開(kāi)始報(bào)過(guò)幾次錯(cuò),后來(lái)就沒(méi)出現(xiàn)了,也沒(méi)找到原因,就先那樣了。

后來(lái)發(fā)給別人了,完全打不開(kāi),跟之前的報(bào)錯(cuò)一樣,看來(lái)必須要搞清楚報(bào)錯(cuò)的原因了。

問(wèn)題排查

報(bào)錯(cuò)內(nèi)容

首先貼一下報(bào)錯(cuò)的信息:

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:
Line 8 in XML document from class path resource [spring.xml] is invalid;
nested exception is org.xml.sax.SAXParseException;
lineNumber: 8; columnNumber: 76;
cvc-elt.1: 找不到元素 'beans' 的聲明。

spring.xml 代碼截取如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
</beans>

問(wèn)題復(fù)現(xiàn)

因?yàn)槲抑耙才龅竭^(guò)這個(gè)報(bào)錯(cuò),所以想著復(fù)現(xiàn)一下問(wèn)題,方便排查。

我直接在虛擬機(jī)中運(yùn)行,無(wú)論是覆蓋安裝還是卸載再次安裝都沒(méi)問(wèn)題,我就想可能是環(huán)境問(wèn)題導(dǎo)致的吧,就想著裝一個(gè)新的虛擬機(jī)試一下。

新系統(tǒng)裝完之后,一運(yùn)行,果然崩潰了,報(bào)錯(cuò)信息一樣。能復(fù)現(xiàn)問(wèn)題,可以說(shuō)為解決問(wèn)題開(kāi)了個(gè)好頭。

問(wèn)題排查

找到原因

通過(guò)關(guān)鍵字 cvc-elt.1: 找不到元素 'beans' 的聲明 開(kāi)始搜索,搜索到的結(jié)果基本都是以下的內(nèi)容。

配置文件頭部配置的 xsd 版本信息不正確,造成解析時(shí)出錯(cuò)。spring 頭部 xsd 或 dtd 校驗(yàn)文件的查找分兩步,第一先從本地 jar 包中找,如果找到則用本地jar包的進(jìn)行校驗(yàn)(可以在 spring-beans.jar 或 spring-context.jar 里的 META-INF 下的 spring.schemas 文件中找到 xsd 文件位置的定義),如果沒(méi)有找到則進(jìn)行第二步查找,它會(huì)嘗試從網(wǎng)絡(luò)中下載該文件然后校驗(yàn),如果系統(tǒng)斷網(wǎng)或下載不下來(lái),則會(huì)拋出上述異常。

照著這個(gè)思路,朋友也提醒我,看下虛擬機(jī)的系統(tǒng)是否聯(lián)網(wǎng)了,我一看,果然沒(méi)聯(lián)網(wǎng),趕緊聯(lián)網(wǎng)測(cè)試發(fā)現(xiàn)能正常運(yùn)行,問(wèn)題的原因找到了。

再次困惑

找到了問(wèn)題原因,好像就馬上就能解決了,但事實(shí)并不是我想的那樣。

網(wǎng)上的解決辦法是:

將 applicationContext.xml 中 xsd 文件定義的版本改為 spring jar 包中定義的 xsd 的版本,如果版本定義的太高在本地會(huì)無(wú)法找到,只能從網(wǎng)絡(luò)上下載。

但是,查看 spring-beans.jar 里 META-INF 下的 spring.schemas 文件,發(fā)現(xiàn)無(wú)論版本號(hào)是多少,最后指向的都是一個(gè)。

截取了部分代碼如下:

http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.2.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.0.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.1.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.2.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.3.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans.xsd

后來(lái)又搜到一篇文章「spring5之SAXParseException:cvc-elt.1: 找不到元素 “beans” 的聲明[1]」,說(shuō) Spring 5 之后就不需要寫(xiě)版本號(hào)了。

那跟我看到的情況是一樣的,確實(shí)各個(gè)版本號(hào)指向的都是同一個(gè),看來(lái)不是版本號(hào)的問(wèn)題,那到底是怎么回事?

一波三折

既然 xsd 的版本沒(méi)錯(cuò),那問(wèn)題出在哪里呢?

繼續(xù)搜索之后,看到了這篇文章「系統(tǒng)啟動(dòng)時(shí),spring配置文件解析失敗,報(bào)”cvc-elt.1: 找不到元素 'beans' 的聲明“異常[2]」。

打包之后,spring.schemas 位于 jar 包的 META-INF 目錄下,但是 spring.schemas 里并沒(méi)有 spring-beans.xsd,看來(lái)問(wèn)題是在這了,我仿照作者的方法,把上面提到的 spring-beans.jar 里 META-INF 下的 spring.schemas 里的關(guān)于 spring-beans.xsd 的部分添加到了壓縮包的 spring.schemas 里。

重新打包之后仍然報(bào)錯(cuò),但是報(bào)的錯(cuò)不是之前的錯(cuò)了,是說(shuō)我的主函數(shù)類找不到了,真的是讓人摸不著頭腦,情況類似啊,為什么我的不好使。

豁然開(kāi)朗

還是上面的操作,我讓朋友試了一下,他測(cè)試之后居然好使!

我問(wèn)他怎么操作的,他說(shuō)跟我的操作一樣,只不過(guò)把 https 部分的也加上了,我心想不應(yīng)該啊,也沒(méi)引用 https 的 spring-beans.xsd,不應(yīng)該是這個(gè)問(wèn)題吧。

我按照他的操作,在我電腦上重新打包,發(fā)現(xiàn)還是不好使;我又把他給我的文件替換到我打的包里,還是不好使。真的是蒙了,操作是一樣的,為什么我的不好使。

后來(lái)朋友說(shuō)讓我把修改好的包發(fā)給他,他看了之后發(fā)現(xiàn)我打的包大小不一樣,正常應(yīng)該是 14MB,但是我的包是 500KB,我又重新操作了一遍,發(fā)現(xiàn)我把文件替換之后,整個(gè) jar 包的大小變小了,原來(lái)是我的壓縮包軟件有問(wèn)題。

朋友的電腦是 Windows,是直接用 WinRAR 打開(kāi) jar 包,然后把文件替換;我的是 Mac,用的 eZip 軟件打開(kāi) jar 包,然后替換文件。最后,我使用虛擬機(jī)按照朋友的操作測(cè)試后發(fā)現(xiàn) ok 了。

誰(shuí)能料到是壓縮軟件的問(wèn)題呢?但是也不能全怪軟件,畢竟人家是解壓縮軟件,并不是專門(mén)處理 jar 文件的。

完美解決

雖然找到了問(wèn)題原因,也有了解決辦法,但是解決的辦法卻不夠好,總不能每次打好包再手動(dòng)替換文件吧?

我覺(jué)得既然我們能遇到的問(wèn)題,肯定也有其他人遇到,我就使用關(guān)鍵字 spring.schemas 打包之后沒(méi)有把 beans 打進(jìn)去 進(jìn)行了搜索,發(fā)現(xiàn)了完美的解決方案:「spring打包到j(luò)ar問(wèn)題[3]」。

問(wèn)題的根本原因是,由于 spring 多個(gè) jar 包都包含 spring.schemas,「Build Artifacts」和「Maven」默認(rèn)打包只會(huì)把第一次遇到的 schemas 文件打入 jar 包。

解決辦法是使用 maven shade 打包,具體的代碼如下:

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-shade-plugin</artifactId>
 <version>3.2.2</version>
 <executions>
 <execution>
 <phase>package</phase>
 <goals>
 <goal>shade</goal>
 </goals>
 <configuration>
 <transformers>
 <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
 <mainClass>xxx.xxx.xxx.App</mainClass>
 </transformer>
 <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
 <resource>META-INF/spring.handlers</resource>
 </transformer>
 <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
 <resource>META-INF/spring.schemas</resource>
 </transformer>
 <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
 <resource>META-INF/spring.tooling</resource>
 </transformer>
 </transformers>
 </configuration>
 </execution>
 </executions>
</plugin>

將代碼放在項(xiàng)目 pom.xml 的 <plugins> 節(jié)點(diǎn)里,其中代碼里的 <mainClass> 節(jié)點(diǎn)里要寫(xiě)主函數(shù)的完整目錄。

感受

問(wèn)題解決了,從中也得到一些感受:

•遇到問(wèn)題還是得盡快解決,因?yàn)閱?wèn)題是不會(huì)放過(guò)你的。

•Mac 下的壓縮軟件暫時(shí)沒(méi)有 Windows 下的好使。

•網(wǎng)上的答案真的是千篇一律,都是一個(gè)人的答案被很多人復(fù)制,而且沒(méi)有講清楚問(wèn)題。

•搜到的千篇一律的答案,可能已經(jīng)過(guò)時(shí)了,并不適合自己的情況。

•自己遇到的問(wèn)題,絕大部分都是別人遇到過(guò)的,是可以解決的,耐心搜索就會(huì)找到解決辦法。

引用鏈接

[1] spring5之SAXParseException:cvc-elt.1: 找不到元素 “beans” 的聲明

[2] 系統(tǒng)啟動(dòng)時(shí),spring配置文件解析失敗,報(bào)”cvc-elt.1: 找不到元素 'beans' 的聲明“異常

[3] spring打包到j(luò)ar問(wèn)題

總結(jié)

到此這篇關(guān)于一次Spring項(xiàng)目打包問(wèn)題排查的文章就介紹到這了,更多相關(guān)Spring項(xiàng)目打包問(wèn)題排查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Jasypt對(duì)SpringBoot配置文件加密

    基于Jasypt對(duì)SpringBoot配置文件加密

    這篇文章主要介紹了基于Jasypt對(duì)SpringBoot配置文件加密,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 詳解java的值傳遞、地址傳遞、引用傳遞

    詳解java的值傳遞、地址傳遞、引用傳遞

    這篇文章主要介紹了詳解java的值傳遞、地址傳遞、引用傳遞的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Java使用BigDecimal解決小數(shù)計(jì)算問(wèn)題

    Java使用BigDecimal解決小數(shù)計(jì)算問(wèn)題

    Java中的BigDecimal是一個(gè)內(nèi)置類,用于精確表示任意大小的十進(jìn)制數(shù),它提供了一種處理浮點(diǎn)運(yùn)算精度問(wèn)題的方法,特別適合金融、貨幣交易等需要高精度計(jì)算的場(chǎng)景,本文給大家介紹了java中如何使用BigDecimal解決小數(shù)計(jì)算問(wèn)題,需要的朋友可以參考下
    2024-08-08
  • mybatis-plus更新策略部分字段不更新問(wèn)題

    mybatis-plus更新策略部分字段不更新問(wèn)題

    這篇文章主要介紹了mybatis-plus更新策略部分字段不更新問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java Web實(shí)現(xiàn)添加定時(shí)任務(wù)的方法示例

    Java Web實(shí)現(xiàn)添加定時(shí)任務(wù)的方法示例

    這篇文章主要介紹了Java Web實(shí)現(xiàn)添加定時(shí)任務(wù)的方法,涉及java web定時(shí)任務(wù)控制類定義、調(diào)用及監(jiān)聽(tīng)器定義、添加等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 使用Feign傳遞請(qǐng)求頭信息(Finchley版本)

    使用Feign傳遞請(qǐng)求頭信息(Finchley版本)

    這篇文章主要介紹了使用Feign傳遞請(qǐng)求頭信息(Finchley版本),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • IDEA中程序包Org.Springframework.Boot不存在問(wèn)題及解決

    IDEA中程序包Org.Springframework.Boot不存在問(wèn)題及解決

    這篇文章主要介紹了IDEA中程序包Org.Springframework.Boot不存在問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java二維數(shù)組查找功能代碼實(shí)現(xiàn)

    Java二維數(shù)組查找功能代碼實(shí)現(xiàn)

    這篇文章主要介紹了Java二維數(shù)組查找功能代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Spring中11個(gè)最常用的擴(kuò)展點(diǎn)總結(jié),你知道幾個(gè)

    Spring中11個(gè)最常用的擴(kuò)展點(diǎn)總結(jié),你知道幾個(gè)

    我們知道IOC(控制反轉(zhuǎn))和AOP(面向切面編程)是spring的基石,除此之外spring的擴(kuò)展能力非常強(qiáng),下面這篇文章主要給大家介紹了關(guān)于Spring中11個(gè)最常用的擴(kuò)展點(diǎn)的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Java精品項(xiàng)目瑞吉外賣(mài)之后端登錄功能篇

    Java精品項(xiàng)目瑞吉外賣(mài)之后端登錄功能篇

    這篇文章主要為大家詳細(xì)介紹了java精品項(xiàng)目-瑞吉外賣(mài)訂餐系統(tǒng),此項(xiàng)目過(guò)大,分為多章獨(dú)立講解,本篇內(nèi)容為后端登錄功能的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論