2011-10-17 86 views
9

在我當前的項目中,我們的目標是一個JDK 1.6運行時環境。對於傳統rasons,Xerces JAR文件捆綁在應用程序中。JDK 1.6和Xerces?

這些不再需要正確嗎? JDK已經(有一段時間了)在JDK中捆綁了XML解析庫?

+0

爲什麼不試試捆綁它們呢? – 2011-10-17 13:18:24

+1

他們沒有比1.5更多或更少需要。 1.6擁有Xerces的一些奇怪分支版本,只是1.5以外的奇怪版本。根據@DaveNewton,判斷它是否適用於您的唯一方法就是嘗試一下。 – bmargulies 2011-10-17 13:19:48

+0

我想我必須在我們的項目上運行一些依賴分析軟件。如果我們使用的某些開源框架直接取決於Xerces而不是JAXP,那麼我不會感到驚訝。 – 2011-10-17 20:14:59

回答

12

從012開始添加JAXP到JRE時,綁定XML解析器並沒有必要。您應該使用JAXP,而不是直接調用Xerces。在內部,JRE捆綁並使用Xerces(帶有「com.sun」前綴)。

+3

這是正確的。在谷歌搜索之後,似乎JDK 1.4支持JAXP 1.1,並將Apache分類爲不帶類的名稱;當人們想要使用比JDK捆綁的版本更新的版本時造成大量問題。 (http://people.apache.org/~edwingo/jaxp-faq.html#JDK14) – 2011-10-17 20:20:18

20

這些XML服務使用所謂的「服務提供者」機制插入應用程序環境。

其工作原理如下:

  1. 它試圖找到準確點,工廠類,應使用系統屬性。例如。 -Djavax.xml.parsers.SAXParserFactory=<some class>
  2. 如果沒有找到系統屬性FactoryFinder尋找特殊屬性文件中的屬性。例如${java.home}/lib/jaxp.properties
  3. 如果未找到文件屬性,FactoryFinder會在類路徑META-INF/services/<some service>(例如, META-INF/services/javax.xml.parsers.SAXParserFactory。 這是一個應包含工廠類名稱的文件,例如org.apache.xerces.jaxp.SAXParserFactoryImpl
  4. 如果類路徑中沒有這樣的文件,則java使用其默認工廠實現。

所以,如果你沒有系統屬性指向顯而易見的工廠類java會選擇適當的安裝實現。

+1

謝謝你的一個非常有用的答案,即使它沒有回答我的問題。 – 2011-10-17 20:16:06

+4

這是標準靜態'SAXParserFactory'代碼的工作方式,請參閱[鏈接](http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/SAXParserFactory.html#newInstance%28 %29)爲這些和一些更多的細節。這些是將初始JDK/JRE捆綁機制與您選擇的XML庫耦合的方式。也可以使用_Java認可的標準覆蓋機制完全替代JDK/JRE捆綁的XML庫,例如:http://docs.oracle.com/javase/7/docs/technotes/guides/standards/。 '-Djava.endorsed.dirs = path_to_folder_containing_new_library_jars'。 – 2012-11-16 21:14:36

11

JDK中的解析器是Xerces的一個分支,但它非常麻煩。我會建議生產應用程序始終首先使用解析器的Apache版本。這些錯誤是罕見的,但它們是不可預測的,它們不僅影響在現實生活中看不到的角落案例;我看到很多情況下,很多枯燥的XML文檔正在被解析,並且損壞的數據被傳遞給應用程序以獲取屬性值。 Sun/Oracle對解決問題沒有興趣。每次使用Apache Xerces。

+1

嗨。你有沒有對JDK解析器中錯誤的索引/描述?你在說什麼JDK版本? – 2011-10-17 20:10:42

+0

當人們向我發送由於JDK解析器問題導致的撒克遜錯誤報告時,我不再費力地向Oracle報告問題,因爲這樣做看起來沒有任何效果。所以不,我不能引用參考文獻。 – 2012-01-25 16:02:02

1

支持的標準覆蓋機制工作得很好。 Djava.endorsed.dirs = path_to_folder_containing_new_library_jars將解決JDK 1.6的問題。

我已經在Thymleaf上下文中驗證了上述解決方案。在某些情況下,如果您使用LEGACYHTML5模式,並且您使用NekoHtml解析器來自動更正未關閉的html標記,則Neko依賴於Xerces jars。設置類路徑並不能解決問題。

謝謝s-n-ushakov。