JDK 1.6和Xerces?

Gle*_*ech 10 java xml legacy

在我当前的项目中,我们的目标是JDK 1.6 Runtime环境.对于传统rasons,Xerces JAR文件捆绑在应用程序中.

这些不再需要了吗?JDK(有一段时间)在JDK中捆绑了XML解析库吗?

sva*_*aor 21

这些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将悄然选择合适的实现方式.

  • 这是标准静态`SAXParserFactory`代码的工作方式,参见[link](http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/SAXParserFactory.html#newInstance%28% 29)了解这些以及更多细节.这些是将初始JDK/JRE捆绑机制与您选择的XML库耦合的方法.还可以使用_Java Endorsed Standards Override Mechanism完全替换JDK/JRE捆绑的XML库:_ http://docs.oracle.com/javase/7/docs/technotes/guides/standards/,例如`-Djava .endorsed.dirs = path_to_folder_containing_new_library_jars`. (5认同)

Ing*_*gel 14

JAXP被添加到JRE 时,从1.4开始就没有必要捆绑XML解析器.您应该使用JAXP而不是直接调用Xerces.在内部,JRE捆绑并使用Xerces(带有"com.sun"前缀).

  • 这是对的.经过一些谷歌搜索后,似乎JDK 1.4支持JAXP 1.1,并捆绑了分类为不带名字的Apache; 当人们想要使用比JDK捆绑的版本更新的版本时,会导致大量问题.(http://people.apache.org/~edwingo/jaxp-faq.html#JDK14) (3认同)

Mic*_*Kay 11

JDK中的解析器是Xerces的一个分支,但它非常错误.我建议生产应用程序始终优先使用Apache版本的解析器.这些错误是罕见的,但它们是不可预测的,它们不仅影响在现实生活中看不到的角落情况; 我见过许多情况,其中解析相当无聊的XML文档,并将损坏的数据传递给应用程序以获取属性值.Sun/Oracle没有表现出解决问题的兴趣.每次都使用Apache Xerces.

更新(2018年)

在我看来,JDK版本的Xerces的问题似乎已经在Java 8中解决了,所以这个建议已经过时了.

  • 你好。你有关于 JDK 解析器中的错误的一些参考/描述吗?你在谈论什么 JDK 版本? (2认同)