我正在尝试在Oracle中使用第三方Java库。该库似乎与我们的Oracle 10g服务器托管的jvm的1.4版本兼容,因为它可以在Oracle外部正常运行,因此我认为我应该能够使其工作。该库最终发出基于SOAP的http请求,并且在Oracle中运行时遇到类解析错误。

这是显示差异的行:

Class msgfact = Class.forName("com.sun.xml.messaging.saaj.soap.MessageFactoryImpl");


我尝试使用loadjava实用程序将这些库注册到Oracle中,并且得到了我认为成功的结果:

C:\> loadjava-详细-模式MYUSER-用户MYUSER / MYPWD @ dbinstance -force saaj-impl.jar


看起来一切都已加载,并且我可以在该列表中看到此MessageFactoryImpl类。但是然后我尝试从Oracle SQL运行这行代码(在我编写并加载loadjava的另一个类中),此行抛出ClassNotFoundException(java.lang.ClassNotFoundException:com / sun / xml / messaging / saaj / soap / MessageFactoryImpl )。

然后我回去尝试在loadjava命令行中添加“ -resolve”开关。就像这些saaj类正在注册一样,但是它们没有正确解析。

我如何才能成功地将这些saaj类放入Oracle,或者如果由于某种原因Oracle已经加载了这些saaj类,如何说服自己的代码成功使用现有类?

FWIW,我已经采取步骤来确保已授予适当的套接字权限,并且我的代码可以成功地向目标URL发出通用的HTTP请求。使用库的SOAP堆栈来实现它只是有麻烦。

编辑:
这是我的loadjava结果的示例。这似乎确切地显示了失败的原因,但是当这些特定类在预解析步骤中似乎得到正确处理时,为什么这些特定类没有得到解决,我感到困惑。我在这里消除了大约80%的文件,但是还有其他类显示相同的类解析问题。

参数:'-verbose''-schema''MYSCHEMA''-user''MYSCHEMA / MYSCHEMA @ actest''-resolve''-force''saaj-impl.jar'
[片段]
创建:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory
loading:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory
创建:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/GifDataContentHandler
loading:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/GifDataContentHandler
创建:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/JpegDataContentHandler
loading:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/JpegDataContentHandler
创建:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl
loading:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl
创建:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl
loading:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl
[片段]
解决:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/AttachmentPartImpl
解决:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/Envelope
解决:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory
错误:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory
    ORA-29534:无法解析引用的对象MYSCHEMA.com/sun/xml/messaging/saaj/soap/SOAPPartImpl
解决:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/GifDataContentHandler
解析:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/JpegDataContentHandler
解决:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl
错误:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl
    ORA-29534:无法解析引用的对象MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl
错误:MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl类
    ORA-29534:无法解析引用的对象MYSCHEMA.com/sun/xml/messaging/saaj/soap/impl/EnvelopeImpl
错误:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl$1
    ORA-29534:无法解析引用的对象MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl
跳过:类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl$2
[片段]
以下操作失败
    类MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory:分辨率
    类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl:分辨率
    类MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl:分辨率
    class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl$1:分辨率
[片段]
退出:处理期间发生故障

最佳答案

首先,在Oracle外部验证您要查找的类是否确实在该jar文件中。我希望是这样,但是检查不会有什么坏处。

然后,我将检查已加载了哪些类以及它们是否具有有效状态。

SELECT object_name, dbms_java.longname(object_name), status
  FROM user_objects
  WHERE object_type='JAVA CLASS'
  ORDER BY 1


如果有很多类,您可能想对此加以限制,例如:

WHERE dbms_java.longname(object_name) LIKE '%MessageFactoryImpl'


如果该类不存在,或者该类具有错误的程序包名称,则问题在于loadjava命令。

如果该类在那里,但其状态为INVALID,则检查USER_ERRORS以查看错误所在。我不记得我是否在Oracle中完成了动态类加载,但是我记得静态链接会产生错误,这暗示着一个类在确实存在时不存在但有错误。

loadjava输出发布后的新信息

loadjava输出似乎与您尝试在数据库中查找该类不一致。如果正在加载但无法解析,则仍应列出,但状态为INVALID。

我得到了JAR,并在一个空模式下尝试了它。该类已加载,但按预期无效:

dev> select object_name, dbms_java.longname(object_name),status
  2  from user_objects
  3  where object_name like '%MessageFactoryImpl';

OBJECT_NAME
--------------------------------------------------------------------------------
DBMS_JAVA.LONGNAME(OBJECT_NAME)
--------------------------------------------------------------------------------
STATUS
-------
/3e484eb0_MessageFactoryImpl
com/sun/xml/messaging/saaj/soap/MessageFactoryImpl
INVALID


然后,我检查了课堂上的错误:

dev> alter java class "com/sun/xml/messaging/saaj/soap/MessageFactoryImpl" resolve;
dev> /

Warning: Java altered with compilation errors.

dev> show error
Errors for JAVA CLASS "/3e484eb0_MessageFactoryImpl":

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      ORA-29521: referenced name javax/xml/soap/MessageFactory could
         not be found

0/0      ORA-29521: referenced name javax/xml/soap/SOAPMessage could not
         be found

0/0      ORA-29521: referenced name javax/xml/soap/MimeHeaders could not
         be found

0/0      ORA-29521: referenced name javax/xml/soap/SOAPException could not
         be found


(假设尝试至少解决一次,这些错误也会在USER_ERRORS中列出。)

显然,此类引用了基础SOAP库中的类。您也必须加载它-您完成了吗?

仅供参考,当我编写一些代码进行Class.forName()调用时,我确实收到了ClassNotFoundException。由于类对象确实存在于架构中,因此这似乎违反直觉。但是,从Oracle中的类加载器的角度来看,无效的类并没有真正“存在”。为了使该类有效,Oracle必须能够解析其对其他类的所有引用。

10-07 13:35