問題描述:
工程中有通過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,也可以解決這個問題。