關於dom4j中jaxen運行報錯問題


問題描述:

      工程中有通過maven的方式依賴dom4j,而在運行的過程中會報錯。

問題定位:

      通過查看代碼,會使用DocumentHelper類,而這個類中,有一個static方法,該方法內容如下:

   public static XPath createXPath(String xpathExpression,
            VariableContext context) throws InvalidXPathException {
        return getDocumentFactory().createXPath(xpathExpression, context);
    }

 在此處,VariableContext context來自於org.jaxen.VariableContext。

       在查看此類時,該處顯示無該類。

       同時,根據java虛擬機的加載原則分析,在第一次使用某類時,會加載其中的所有的靜態方法和靜態類,所以此處無法找到這個類也是會報錯。

問題已經定位到。

問題分析:

      為什么會出現這個問題呢,因為工程依賴dom4j,而dom4j依賴jaxen包,按照我們的以往的認知來看,jaxen包也會被載入,但是很明顯,這里沒有被加載。

     此處涉及到maven的一個依賴的加載配置,如果A->B->C,A依賴B,B依賴C,如果在B中設置C為<optional>true</optional>的話,那么使用B不會自動加載C,且在代碼編譯過程中不會報錯。

     查看dom4j中jaxen的配置,果然有<optional>true</optional>

問題解決:

     1.通常的解決辦法是在pom文件中再加入jaxen的依賴

     2.分析dom4j的代碼,在不添加jaxen包依賴的情況下,如果使用DocumentHelper,就一定會發生找不到jaxen包的問題,這應該算是一個bug,現有的dom4j使用的是1.6.1,有沒有更新的dom4j解決這個問題呢?看了下官網,好嘛,1.6.1時05年的,下一個版本時17年的2.0.2和2.1.0,依賴2.0.2,該問題果然被解決了,新的jaxen配置為

 <dependencies>
    <dependency>
      <groupId>jaxen</groupId>
      <artifactId>jaxen</artifactId>
      <version>1.1.6</version>
      <scope>compile</scope>
    </dependency>

 如果改為2.0.2,也可以解決這個問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM