2

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

我按照此链接 更改了默认实现:

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

我用 in 创建了 3 个具有上述名称的文件,META-INF/services并在每个文件中放入以下行:

在文件中: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 应用服务器上时,我得到了实现类org.w3c.dom.Document是 :oracle.xml.parser.v2.XMLDocument而不是com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl在 Jetty 上进行开发时打印的。

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

4

3 回答 3

1

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

于 2010-11-10T09:50:16.377 回答
1

类加载器之前可能已经找到了oracle.xml.parser.v2.XMLDocumentfor 的实现。检查是否可以排除 Oracle 实现,查找包含该类的文件。这可能位于“容器范围”文件夹中,而您的实现位于“应用程序范围”文件夹中。org.w3c.dom.Documentcom.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl

没有完全相同的问题,但类似,类加载器加载的 jar 的顺序很重要。希望这至少可以让您朝着正确的方向前进

于 2010-11-10T10:12:16.973 回答
0

有两件事需要注意:
1. com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl给你一个提示:它是一个内部实现(相对于公共 API)。它容易发生变化,不应成为生产开发的首选。
2. 我发现这com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl是最适合我所有需求的实现,据我所知,它符合规范。

你可以很容易地看到冲突。我希望有一天会有一个平台标准,用于文档实现及其所有工厂等的公共 API。

这是我的经验:

在类路径中使用 META-INF/services 和 JAR 排序感觉就像是一种 hack,工作得更糟,最后,我放弃了这种方法。这就是为什么它对我不起作用的原因:类路径上有 2+ 3rd 方实现,所以.xerces.internal.默认情况下没有希望。但是,将其指定为 System Property 将覆盖所有内容,这不适用于 3rd 方产品。

• • • 我最终创建了一个属性并明确加载了我想要的精确工厂,而不依赖于 META-INF/services 和系统属性的搜索机制。

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

于 2015-02-12T01:02:57.597 回答