gpt4 book ai didi

java - Oracle JVM 运行时错误 : Provider com. sun.xml.stream.ZephyrParserFactory 未找到

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:29 25 4
gpt4 key购买 nike

背景:

我们有一个 Oracle 11g 数据库,运行带有 JRE 版本 1.6.0_43 的 Java 虚拟机。我们的用户界面托管在 Apache Web 服务器上,该服务器通过 mod-plsql 与数据库交互。

我们有一些 PLSQL 过程调用存储在数据库中 Java 源中的 Java 过程 - 一个例子是我们用来生成 XLS 文件的 Java 过程。

我们之前一直使用 Apache POI 套件版本 3.8 通过 DOM 解析器从 XML 生成 XLS 文件,但我们已升级到 POI 3.9,以便我们可以使用 Streaming XSSF Workbook 类高效生成 XLSX 文件(SXSSF 在 POI 3.8 中可用,但核心过程 dispose() 直到 POI 3.9 才可用)。

此外,出于效率原因,我们在生成 XLSX 文件时使用 StAX 解析 ( XMLStreamReader ),而不是我们在生成 XLS 时使用的更耗内存的 DOM 解析器方法。

要将数据库中的 Java POI 3.8 升级到 3.9,我们分两步进行:

1) 在包含 POI 3.8 套件的 jar 上运行 dropjava:

dropjava -user=xxxxxx@xxxxxx poi-3.8-20120326.jar poi-examples-3.8-20120326.jar poi-excelant-3.8-20120326.jar poi-ooxml-3.8-20120326.jar poi-ooxml-schemas-3.8-20120326.jar poi-scratchpad-3.8-20120326.jar lib\commons-logging-1.1.jar lib\junit-3.8.1.jar lib\log4j-1.2.13.jar ooxml-lib\dom4j-1.6.1.jar ooxml-lib\stax-api-1.0.1.jar ooxml-lib\xmlbeans-2.3.0.jar

2) 然后我们运行 loadjava 命令来安装 3.9 套件:

loadjava -user=xxxxxx@xxxxxx -genmissing -resolve -force poi-3.9-20121203.jar poi-examples-3.9-20121203.jar poi-excelant-3.9-20121203.jar poi-ooxml-3.9-20121203.jar poi-ooxml-schemas-3.9-20121203.jar poi-scratchpad-3.9-20121203.jar lib\commons-logging-1.1.jar lib\junit-3.8.1.jar lib\log4j-1.2.13.jar ooxml-lib\dom4j-1.6.1.jar ooxml-lib\stax-api-1.0.1.jar ooxml-lib\xmlbeans-2.3.0.jar

XLSX一代一开始根本不起作用;我们在运行时在 Java 中收到了这个异常:

java.lang.ClassCastException

我们没有确认是哪个特定类导致了问题,但我们注意到,在安装 POI 3.9(其中包括 StAX stax-api-1.0.1 jar)后,数据库中的 Java 类库中有一些重复项。具体来说,这些类及其路径是重复的(并被导入到我们生成 xlsx 的 Java 源代码中):

import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;

由于重复项可能导致异常,我们删除了 StAX 解析器 jar(StAX 套件在 Java 版本之前的某个时刻被“折叠”到核心 JDK 中,因此无需导入 POI 3.9 中包含的 StAX jar):

dropjava -user=xxxxxx@xxxxxx ooxml-lib\stax-api-1.0.1.jar

这删除了重复的类并解决了 ClassCastException,即它不再发生。但有一个新问题。

问题:

新的 XLSX 方法现在在运行时间歇性失败并出现以下错误:

javax.xml.stream.FactoryFinder$ConfigurationError: Provider com.sun.xml.stream.ZephyrParserFactory not found

有问题的类 com.sun.xml.stream.ZephyrParserFactory, 似乎已正确安装在我们的数据库中。我们在一个单独的平台上做了一些测试,我们发现删除该类会完全破坏我们的解析,即我们确信该类已安装在我们的实时平台上,因为我们的代码在大多数情况下都可以工作,但如果未安装该类,则任何时候都不会工作。

该错误大约每 10 次左右的 XLSX 生成尝试才会发生一次(我们每次都使用不同的文件和相同的文件进行测试 - XML 的内容是什么似乎并不重要)。这行代码生成错误:

XMLInputFactory factory = XMLInputFactory.newInstance();    

通过一些调查,我们发现错误是否发生取决于哪个 Oracle session 正在处理 Web 服务器收到的初始 HTTP 请求。 我觉得这里真正的问题是,是什么导致只有某些 Oracle session 无法作为提供者访问 Zephyr 类并产生错误?任何想法将不胜感激。

最佳答案

这可能与此处描述的 CDATA 事件 的处理有关 http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP5.html

根据输入文件是否触发此事件。如果引发该事件,您将收到 Provider com.sun.xml.stream.ZephyrParserFactory not found 错误。

您需要调查哪些代码尝试实例化这个具体的服务提供者。

通常,实现特定接口(interface)的服务提供者在 Jar 文件内的 META-INF/services 目录中声明。在这里找到 ServiceLoader 的描述它提供了一个简单的服务提供商加载工具

关于java - Oracle JVM 运行时错误 : Provider com. sun.xml.stream.ZephyrParserFactory 未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37160733/

25 4 0