2010-07-06 284 views
2

在我的項目中,有2個庫,每個庫都依賴於XML解析類java.xml.parsers.DocumentBuilderFactory。這些庫中的每一個都引用來自不同jar的文件(一個從名爲xmlParserAPIs的jar獲得,另一個從xml-apis-1.0.b2.jar獲取)。不幸的是,這些文件中的每個文件都有不同的版本,所以我看到運行時錯誤,這取決於它們加載的順序。這兩個xml jar都是第三方庫的傳遞依賴項。有處理這種衝突的好方法嗎?maven依賴衝突

編輯:我不確定它是如何處理問題的差異,但這隻發生在測試中,因爲其中一個依賴項在測試範圍內。

感謝, 傑夫

回答

3

(...)不幸的是不同的版本在這些文件中的,所以我看到的運行時錯誤,這取決於它們加載的順序之類的。

從理論上講,xml-apis.jarxmlParserAPIs.jar(從Xerces2的-j)是相同的JAR,但名稱不同,xmlParserAPIs.jar被廢棄了多年(見this messagethis one)。

如果您的依賴關係依賴於xml-apis.jar的不同和不兼容版本,我會說這些依賴關係是互斥的,換句話說不兼容,至少對於您使用的版本是不相容的。唯一的解決方案是找到具有收斂依賴性的版本。

如果他們可以使用兼容版本,請使用相關exclusion代替xmlParserAPIs.jar以僅使用xml-api.jar

我不知道它是如何在處理問題上有所作爲,但這隻發生在測試中,因爲其中一個依賴關係在測試範圍內。

不,這只是解釋了爲什麼你不會在運行時遇到問題(因爲test作用域不在類路徑上,顯然不會發生衝突)。

+0

謝謝。它看起來像我在其他兩個庫中的XML庫衝突。如果我從瓶子中排除xmlParserAPI和xml-apis,並讓jre提供這些,那麼一切運作良好。這是不安全的事情嗎?我應該爲java.xml.parsers添加一個系統範圍的依賴關係嗎?謝謝。 – 2010-07-06 21:43:24

+0

@Jeff 1.使用'mvn dependency:tree'來分析你的依賴關係。 2.如果它適用於JRE的解析器,那麼就排除依賴關係。 3.我傾向於避免「系統」範圍內的依賴關係(比我認爲的更多麻煩而不是好處)。 – 2010-07-06 21:54:46

+0

感謝您的幫助。 – 2010-07-06 23:51:09