我需要更改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应用服务器上进行部署。
答案 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能够找到一种方法来标准化这个过程并使其更加灵活和可控。