Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDK1.6和Xerces?_Java_Xml_Legacy - Fatal编程技术网

Java JDK1.6和Xerces?

Java JDK1.6和Xerces?,java,xml,legacy,Java,Xml,Legacy,在我当前的项目中,我们的目标是JDK1.6运行时环境。对于遗留rasons,Xerces JAR文件捆绑在应用程序中 这些已经不需要了,对吗?JDK(有一段时间)在JDK中捆绑了XML解析库?自从1.4版添加到JRE后,就不需要捆绑XML解析器了。您应该使用JAXP,而不是直接调用Xerces。在内部,JRE以任何方式捆绑和使用Xerces(带有“com.sun”前缀)。这些XML服务使用所谓的“服务提供者”机制插入应用程序环境 其工作原理如下: 它试图找到正好指向应该使用的工厂类的系统属性。例

在我当前的项目中,我们的目标是JDK1.6运行时环境。对于遗留rasons,Xerces JAR文件捆绑在应用程序中


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

自从1.4版添加到JRE后,就不需要捆绑XML解析器了。您应该使用JAXP,而不是直接调用Xerces。在内部,JRE以任何方式捆绑和使用Xerces(带有“com.sun”前缀)。

这些XML服务使用所谓的“服务提供者”机制插入应用程序环境

其工作原理如下:

  • 它试图找到正好指向应该使用的工厂类的系统属性。例如,
    -Djavax.xml.parsers.SAXParserFactory=
  • 如果未找到系统属性,则FactoryFinder将在特殊属性文件中查找属性。例如
    ${java.home}/lib/jaxp.properties
  • 如果未找到文件属性,FactoryFinder将在类路径
    META-INF/services/
    中查找服务描述,例如
    META-INF/services/javax.xml.parsers.SAXParserFactory
    。 它是一个应该包含工厂类名的文件,例如
    org.apache.xerces.jaxp.saxparserfactorympl
  • 如果类路径中没有这样的文件,java将使用默认的工厂实现

  • 因此,如果您没有指向工厂类的系统属性,java将悄悄地选择合适的实现。

    JDK中的解析器是Xerces的分支,但它有很多缺陷。我建议生产应用程序优先使用Apache版本的解析器。这些bug很少见,但它们是不可预测的,它们不仅影响现实生活中看不到的角落案例;我看到过许多情况,在这些情况下,解析非常枯燥的XML文档,并将损坏的数据传递给应用程序以获取属性值。Sun/Oracle对解决该问题没有兴趣。每次都使用ApacheXerces

    更新(2018)


    据我所知,Xerces的JDK版本的问题似乎已经在Java8中得到了解决,所以这个建议已经过时了。

    认可的标准覆盖机制工作得很好。Djava.annocated.dirs=path\u to\u folder\u包含新的\u library\u jars将解决JDK1.6的问题

    我已经在ThymalLeaf的上下文中验证了上述解决方案。在某些情况下,如果您选择LEGACYHTML5模式,并且如果您使用NekoHtml解析器自动更正未关闭的html标记, Neko依赖Xerces罐子。设置类路径并不能解决问题


    感谢s-n-ushakov。

    为什么不直接试用而不捆绑它们呢?它们与1.5版相比不需要多少。1.6有一些奇怪的Xerces分叉版本,只是与1.5不同。根据@DaveNewton的说法,判断它是否对您有效的唯一方法就是尝试一下。我想我必须在我们的项目上运行一些依赖性分析软件。如果我们使用的一些开源框架直接依赖于Xerces而不是使用JAXP.JDK Xerces,那么我不会感到惊讶。JDK Xerces存在一些严重的未解决问题,并且不清楚每个JDK中都有哪个版本的ApacheXerces。我在最近的JDK1.8_152中得到了一个偶数,我可以通过在类路径中包含Xerces 2.11来简单地使它消失。幸运的是,JAXP接口和ServieLoader使切换实现变得非常容易@RobertJackWill Xerces-J 2.12.0发布(2018年4月30日),见此处:您好。您是否有JDK解析器中bug的som引用/描述?你说的是什么JDK版本?当人们向我发送Saxon bug报告时,结果是由于JDK解析器问题,我不再费心向Oracle报告问题,因为这样做似乎没有效果。不,我不能引用引用,因为JDK中包含了Java9,一个相当稳定的Xerces版本(v2.11)。因此,无需使用Java9中的Xerces的Apache版本。这是正确的。通过谷歌搜索,JDK1.4似乎支持JAXP 1.1,并将Apache类与未命名的类名捆绑在一起;当人们想要使用比与JDK捆绑的版本更新的版本时,会导致大量问题。()这是标准静态
    SAXParserFactory
    代码的工作方式,有关这些和更多详细信息,请参阅。以下是将初始JDK/JRE捆绑机制与您选择的XML库耦合的方法。还可以使用Java认可的标准覆盖机制完全替代JDK/JRE捆绑的XML库:,例如
    -Djava.annowed.dirs=path\u to\u folder\u包含新的\u library\u jars