最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過IDEA快速定位和排除依賴沖突問題

 更新時間:2019年06月12日 09:34:13   投稿:mrr  
這篇文章主要介紹了通過IDEA快速定位和排除依賴沖突問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下

前言

我們程序員在開發(fā)的時候經(jīng)常會遇到各種各樣的 BUG 問題,其中大部分是業(yè)務(wù)邏輯異常,還有一些是代碼書寫不規(guī)范造成的異常例如:NullPointException(NPE),IndexOutOfBoundsException 等等,其實這些我們都好定位和修復(fù)。但是還有一些運行時異常定位起來是特別頭疼的,那就是 jar 包沖突引起的異常。

一般程序在運行時發(fā)生類似于 java.lang.ClassNotFoundException , Method not found: '......' ,或者莫名其妙的異常信息,這種情況一般很大可能就是 jar包依賴沖突的問題引起的了。

至于為什么會發(fā)生 jar包依賴沖突?這種問題大致可以歸納為如下幾個原因:

  • 版本不匹配,高版本依賴了低版本,或者低版本依賴了高版本。 例如引入第三方庫,但是第三方庫基于的是 JDK7,而你們項目使用的是JDK8。
  • 重復(fù)引入不同版本jar包,造成使用錯誤。 很多時候我們引入第三方輪子,它們依賴引入某個基礎(chǔ)工具使用的是 v 1.0 的 jar,但是我們項目中自己也引入了該 jar,但是版本是 v 2.3,這時就會造成項目中使用同一個組件但是依賴了兩個不同版本的jar,沖突就會發(fā)生。

可以看到,其實總的來說 jar 包沖突的主要原因就是依賴的版本沖突。

異常發(fā)生

項目中需要導(dǎo)出報表,技術(shù)選型的時候,一般是選用 Apache POI,但是 POI 的使用方式比較基礎(chǔ),開發(fā)量大,容易出現(xiàn)內(nèi)存溢出的問題。

考慮到阿里開源了一套解析和生成Excel的工具 - EasyExcel,具有避免內(nèi)存溢出OOM的情況發(fā)生,而且使用方便簡單,所以就將它引入到了我們的項目中,具體的使用版本是 1.0.2。

<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>easyexcel</artifactId>
 <version>1.0.2</version>
</dependency>

而另一個模塊需要使用 POI 的將 Word 轉(zhuǎn)成 PDF 的功能,所以同時又引入了如下 POI 的依賴:

<!-- poi utils -->
<dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi</artifactId>
 <version>3.15</version>
</dependency>
<dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi-ooxml</artifactId>
 <version>3.15</version>
</dependency>

我們從 Maven Repository 可以發(fā)現(xiàn),阿里 EasyExcel 1.0.2 依賴的 POI 也是 3.15,所以照理說應(yīng)該是沒問題的。

但是在接口調(diào)試的時候還是出問題了,而且異常信息很奇怪,不是看一眼就能知道問題原因的并解決的。

Caused by: java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z
 at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:377)
 at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:131)
 at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:98)
 at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:693)
 at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:737)
 at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:351)
 at org.apache.poi.openxml4j.opc.StreamHelper.saveXmlInStream(StreamHelper.java:80)
 at org.apache.poi.openxml4j.opc.internal.marshallers.ZipPartMarshaller.marshallRelationshipPart(ZipPartMarshaller.java:181)
 at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:560)
 at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1557)
 at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:248)
 at org.apache.poi.xssf.streaming.SXSSFWorkbook.write(SXSSFWorkbook.java:941)
 at com.alibaba.excel.write.ExcelBuilderImpl.finish(ExcelBuilderImpl.java:64)
 at com.alibaba.excel.ExcelWriter.finish(ExcelWriter.java:95)
 at com.pingan.haofang.creams.common.utils.ExcelUtil.writeExcel(ExcelUtil.java:71)
 ......
 ... 65 common frames omitted

提取關(guān)鍵信息,可以看到錯誤類型 java.lang.AbstractMethodError ,這個錯誤類型望名知義:抽象方法錯誤。這種類型的錯誤和我們上面說的 ClassNotFoundException 類似,很大可能就是 Jar包依賴沖突所導(dǎo)致的。

異常定位

那我們來定位下是哪個 jar 包沖突了,只需要將沖突的 jar 包排除掉,留下正確的就可以了。

我們可以看到錯誤類型是 java.lang.AbstractMethodError ,錯誤類型后面是具體的錯誤信息描述 :

org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z ,意思是在包 org.apache.xerces.dom 下的類 DocumentImpl 它的方法 getXmlStandalone() 調(diào)用出現(xiàn)了錯誤。

那么具體是誰在調(diào)用呢?我們在異常信息的緊密下一行可以看到如下這一行代碼:

at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:377)

在包路徑 com.sun.org.apache.xalan.internal.xsltc.trax 下, DOM2TO 類代碼的的第377行,有個 setDocumentInfo 方法,我們鼠標(biāo)左鍵點進(jìn)去,在該行加個 Debug 斷點。

我們發(fā)現(xiàn)這個 DOM2TO 類是 JDK1.8中 rt.jar 包里面的,具體類路徑如下:

通過斷點調(diào)試得知,這個 document 對象是 DocumentImpl 實例,

這個DocumentImpl 的真實路徑也是 JDK1.8中 rt.jar 包里面的,它是 CoreDocumentImpl 的子類,CoreDocumentImpl 是接口Document 的實現(xiàn)類。

package com.sun.org.apache.xerces.internal.dom;
public class DocumentImpl
 extends CoreDocumentImpl
 implements DocumentTraversal, DocumentEvent, DocumentRange {
 ......
}
CoreDocumentImpl
package com.sun.org.apache.xerces.internal.dom;
public class CoreDocumentImpl
  extends ParentNode implements Document {
  ......
}

我們在 CoreDocumentImpl 類中第983行發(fā)現(xiàn)了 getXmlStandalone 方法。

這時報錯原因赤條條的擺在我們面前了,顯而易見,DOM2TO類中 setDocumentInfo 方法的參數(shù) Document 是屬于 JDK1.8 中 rt.jar 包下類路徑 com.sun.org.apache.xerces.internal.dom 下的實現(xiàn)類 DocumentImpl。而我們報錯的信息提示中是:

Caused by: java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalone()Z
這個 org.apache.xerces.dom.DocumentImpl 明顯不屬于我們 JDK1.8 的 rt.jar 包,而且也沒有 getXmlStandalone 這個方法。

所以得知,我的項目中 jar 包依賴沖突了,我們只需要排除掉 org.apache.xerces.dom.DocumentImpl 所屬的 jar 包就可以了。如何排除呢?

排除沖突

我們在 IDEA 中雙擊 Shift 鍵,輸入 DocumentImpl,得到如下結(jié)果:

可以發(fā)現(xiàn),這里有兩個 CoreDocumentImpl,一個是我們的 JDK1.8的,一個是屬于 xerce的,而且確實在依賴的 maven jar 包中發(fā)現(xiàn)了 xercesImpl-2.4.0.jar,這個 jar包就是需要排除的 jar包。

發(fā)現(xiàn)了沖突的 jar包,我全局搜索關(guān)鍵字 xerces,并沒有發(fā)現(xiàn)哪一個 pom 中有依賴的代碼,所以很可能是其他的 jar 包傳遞依賴進(jìn)來的。

我們借助 IDEA 的 maven 工具,在 maven 欄右鍵項目模塊,選擇 show Dependencies 或 Ctrl + Shift + Alt + U ,這時候會展示當(dāng)前模塊的 jar 包依賴圖,如下:


雖然這里展示了很多沖突的jar包,其中紅線連接的就是沖突的jar 包,但是我們 Ctrl + F 查詢 xerces 還是沒有結(jié)果。

所以我們需要額外的方式來解決,這時我想到了 IDEA 有個插件 Maven Helper ,具體的插件下載可以參考前面的內(nèi)容,下載好插件后,我們打開 pom.xml 文件,在pom.xml 文件的左下方有個 Dependency Analyzer ,我們點擊之后顯示如下:

  • Conflicts :展示所有沖突。
  • All Dependencies as List :以列表的方式展示所有依賴。
  • All Dependencies as Tree :以樹形的方式展示所有依賴。

我們輸入 xerces,選擇以樹形展示所有依賴,得到如下的信息顯示。


清晰明了,原來這個罪魁禍?zhǔn)资潜?file-web-sdk 帶進(jìn)來的,我們右鍵選擇 Jump To Source 或者 F4 定位到這個 jar 在 pom.xml 的依賴引入位置,如下圖所示,我們通過 exclusion 標(biāo)簽排除 xercesImpl 的引入即可。

<dependency>
 <groupId>com.xx.xx.gov.fileservice</groupId>
 <artifactId>file-web-sdk</artifactId>
 <exclusions>
  <exclusion>
   <groupId>xerces</groupId>
   <artifactId>xercesImpl</artifactId>
  </exclusion>
 </exclusions>
</dependency>

再次啟動項目,測試接口發(fā)現(xiàn)功能正常了,整個排查過程也就結(jié)束了,IDEA的功能還是很強(qiáng)大的。

總結(jié)

很多時候的 jar 包沖突,有些是我們很容易排除,例如在pom.xml 中我們就可以發(fā)現(xiàn)一些重復(fù)引入,但是版本不相同的依賴。還有一些是其他依賴傳遞依賴進(jìn)來的,我們在 pom.xml 文件中不能很直觀的發(fā)現(xiàn),這時候我們借助工具可以發(fā)現(xiàn)這種沖突的依賴。

但是還有一些是更隱秘的沖突,就像本文中描述的依賴沖突,這時候我們需要分析異常信息,并定位沖突的原因和找到具體沖突的依賴引入,最后將它排除就可以了。

本文比較詳細(xì)的介紹了異常的分析和沖突的定位,以及最后的排除。類似的依賴沖突基本都可以參考上述的方式進(jìn)行排查,希望通過本篇文章對大家解決項目中依賴沖突有所幫助。

以上所述是小編給大家介紹的通過IDEA快速定位和排除依賴沖突問題 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • 深入理解 Java 中的 Switch 語句示例詳解

    深入理解 Java 中的 Switch 語句示例詳解

    在Java編程中,switch語句通過表達(dá)式值來執(zhí)行不同代碼塊,本文介紹switch語法、案例、注意事項,以及與if語句的對比,包括基本語法、關(guān)鍵字、表達(dá)式、case常量、break和default的使用,以及如何根據(jù)輸入的字符輸出星期、大小寫轉(zhuǎn)換、成績判斷和季節(jié)判斷等實際應(yīng)用場景
    2024-10-10
  • Java實現(xiàn)簡單的斗地主游戲

    Java實現(xiàn)簡單的斗地主游戲

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡單的斗地主游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 解決Idea項目結(jié)構(gòu)顯示不全問題

    解決Idea項目結(jié)構(gòu)顯示不全問題

    文章描述了在使用IntelliJ IDEA時遇到的問題,并提出了解決方法:關(guān)閉IDEA、刪除項目中的.idea文件夾,然后重新打開IDEA導(dǎo)入項目
    2024-11-11
  • Spring的Aware接口實現(xiàn)及執(zhí)行順序詳解

    Spring的Aware接口實現(xiàn)及執(zhí)行順序詳解

    這篇文章主要為大家介紹了Spring的Aware接口實現(xiàn)及執(zhí)行順序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 解決java.lang.IllegalStateException:Duplicate key異常問題

    解決java.lang.IllegalStateException:Duplicate key異常問題

    java.lang.IllegalStateException:Duplicatekey異常在將List轉(zhuǎn)換為Map時出現(xiàn),解決方法是使用toMap()的重載方法,如果已經(jīng)存在則不再修改,直接使用上一個數(shù)據(jù)
    2025-03-03
  • 深入了解集合操作工具Guava?Collect

    深入了解集合操作工具Guava?Collect

    Guava?Collect是Guava工具包中的一個子模塊,主要對jdk中的集合操作添加了一些簡易的API,同時也是對Collections工具類的擴(kuò)展。本文將結(jié)合實例詳細(xì)說說它的使用,需要的可以參考一下
    2022-10-10
  • SpringBoot log打印及輸出方式

    SpringBoot log打印及輸出方式

    這篇文章主要介紹了SpringBoot log打印及輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 使用Apache?POI和SpringBoot實現(xiàn)Excel文件上傳和解析功能

    使用Apache?POI和SpringBoot實現(xiàn)Excel文件上傳和解析功能

    在現(xiàn)代企業(yè)應(yīng)用開發(fā)中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是一項常見且重要的功能需求,Excel?作為一種廣泛使用的電子表格工具,常常被用來存儲和展示數(shù)據(jù),下面我們來看看如何使用Apache?POI和SpringBoot實現(xiàn)Excel文件上傳和解析功能吧
    2025-01-01
  • Spring Bean的定義及三種創(chuàng)建方式

    Spring Bean的定義及三種創(chuàng)建方式

    本文主要介紹了Spring容器獲取Bean的9種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 解決spring-boot2.0.6中webflux無法獲得請求IP的問題

    解決spring-boot2.0.6中webflux無法獲得請求IP的問題

    這幾天在用 spring-boot 2 的 webflux 重構(gòu)一個工程,寫到了一個需要獲得客戶端請求 IP 的地方,在寫的過程中遇到很多問題,下面小編通過一段代碼給大家介紹解決spring-boot2.0.6中webflux無法獲得請求IP的問題,感興趣的朋友跟隨小編一起看看吧
    2018-10-10

最新評論

芜湖县| 兴安县| 嘉鱼县| 拜泉县| 宜昌市| 闸北区| 德安县| 柘城县| 咸宁市| 海晏县| 登封市| 洛隆县| 安多县| 霍林郭勒市| 彭泽县| 惠水县| 长沙市| 诸城市| 昔阳县| 呼图壁县| 会理县| 高邑县| 长汀县| 江永县| 江西省| 崇州市| 读书| 额济纳旗| 新邵县| 松滋市| 永兴县| 文安县| 博乐市| 正宁县| 八宿县| 兴仁县| 九龙坡区| 定远县| 五大连池市| 广饶县| 永善县|