更改org.w3c.dom.Document的默认实现

时间:2010-11-10 09:07:39

标签: java dom domdocument oas domparser

我需要更改org.w3c.dom.Document项目中的默认实现。

我跟着this link 更改以下内容的默认实现:

javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.SAXParserFactory
javax.xml.transform.TransformerFactory

我已在META-INF/services中创建了3个带有上述名称的文件,并按以下几行添加:

在档案中:javax.xml.parsers.DocumentBuilderFactory我放了:com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

在档案中:javax.xml.parsers.SAXParserFactory我放了:com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl

在档案中:javax.xml.transform.TransformerFactory我放了:org.apache.xalan.processor.TransformerFactoryImpl

但是当我在Oracle Application Server上部署时,我得到org.w3c.dom.Document的实现类是:oracle.xml.parser.v2.XMLDocument而不是在Jetty上进行开发时打印的com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl

我正在开发Jetty并在Oracle应用服务器上进行部署。

3 个答案:

答案 0 :(得分:1)

听起来你做的是正确的事。但是使用系统属性方法可能更简单......至少在你能弄清楚“服务”方法出了什么问题之前。

答案 1 :(得分:1)

类加载器可能会在oracle.xml.parser.v2.XMLDocument之前找到org.w3c.dom.Document的{​​{1}}实现。 检查是否可以排除Oracle实现,查找包含该类的文件。这可能位于“容器范围”文件夹中,您的实现位于“应用程序范围”文件夹中。

没有完全相同的问题,但类似,其中类加载器加载的jar的顺序很重要。希望这可以给你一个正确的方向,至少

答案 2 :(得分:0)

有两点需要注意:
1。 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl有一个提示:它是一个内部实现(与Public API相对)。它很容易改变,不应该是生产开发的首选。
2。 我发现com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl是最适合我所有需求的实现,据我所知,它符合规范。

您可以轻松看到冲突。 我希望有一天会有一个平台标准,一个Document实现的公共API以及它的所有工厂等。

以下是我的经验:

使用META-INF /服务和类路径中的JAR排序感觉就像一个黑客,工作得更糟,最后,我离开了这种方法。 这就是为什么它对我不起作用:类路径上有2个以上的第三方实现,所以默认情况下没有希望获得.xerces.internal.。但是,将其指定为与系统属性一样高,将覆盖所有内容,这对第三方产品无效。

•••我最终创建了一个属性并加载了我想要的精确工厂,没有依赖于通过META-INF /服务和系统属性的搜索机制。

顺便说一下,不同的工厂使用不同的搜索步骤,这是不一致的,并且我希望Oracle能够找到一种方法来标准化这个过程并使其更加灵活和可控