Frage

Ich versuche, eine Java-Bibliothek von Drittanbietern innerhalb von Oracle zu verwenden. Die Bibliothek scheint mit derselben 1.4 -Version des JVM kompatibel zu sein, die unser Oracle 10G -Server hostet, da sie außerhalb von Oracle gut läuft. Daher habe ich das Gefühl, dass ich in der Lage sein sollte, dies zum Laufen zu bringen. Diese Bibliothek stellt letztendlich SOAP-basierte HTTP-Anfragen auf, und ich erhalte beim Ausführen von Oracle Klassenauflösung Fehler.

Hier ist eine Zeile, die den Unterschied zeigt:

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

Ich habe versucht, diese Bibliotheken in Oracle beim LOADJAVA -Dienstprogramm zu registrieren, und ich bekam, was ich für ein erfolgreiches Ergebnis hielt:

C:\>loadjava -verbose -schema MYUSER -user MYUSER/MYPWD@dbinstance -force saaj-impl.jar

Es sieht so aus, als würde alles geladen, und ich kann diese MessageFactoryImpl -Klasse in dieser Liste sehen. Aber dann versuche ich, diese Codezeile von Oracle SQL (in einer anderen Klasse, die ich mit Loadjava geschrieben habe) auszuführen, diese Zeile wirft eine ClassNotFoundException aus (java.lang.classnotfoundException: com/sun/xml/Messaging/SAAJ/SOAP/MessageFactoryImpl ).

Dann ging ich zurück und versuchte, den Switch "-resolve" in der Befehlszeile von Loadjava hinzuzufügen. Es handelt sich wie diese SAAJ -Klassen, die registriert werden, aber sie lösen nicht ordnungsgemäß.

Wie kann ich diese SAAJ -Klassen erfolgreich in Oracle bringen oder wenn Oracle aus irgendeinem Grund diese geladen hat, wie kann ich meinen eigenen Code davon überzeugen, die vorhandene Klasse erfolgreich zu verwenden?

FWIW, ich habe bereits die Schritte unternommen, um sicherzustellen, dass die entsprechenden Socket -Berechtigungen erteilt wurden und mein Code erfolgreich eine generische HTTP -Anfrage an die Ziel -URL stellen kann. Es hat nur Probleme, den Seifenstapel der Bibliothek zu verwenden, um dies zu erreichen.

Bearbeiten: Hier ist ein Beispiel meines LOADJAVA -Ergebniss. Dies scheint genau zu zeigen, was fehlschlägt, aber ich bin verwirrt darüber, warum diese bestimmten Klassen nicht gelöst werden, wenn sie in den Schritten vor der Auflösung ordnungsgemäß behandelt werden. Ich habe hier etwa 80% der Datei beseitigt, aber es gibt andere Klassen, die dieselben Probleme mit der Klassenlösung zeigen.

arguments: '-verbose' '-schema' 'MYSCHEMA' '-user' 'MYSCHEMA/MYSCHEMA@actest' '-resolve' '-force' 'saaj-impl.jar' 
[snip]
creating : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory
loading  : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory
creating : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/GifDataContentHandler
loading  : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/GifDataContentHandler
creating : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/JpegDataContentHandler
loading  : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/JpegDataContentHandler
creating : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl
loading  : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl
creating : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl
loading  : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl
[snip]
resolving: class MYSCHEMA.com/sun/xml/messaging/saaj/soap/AttachmentPartImpl
resolving: class MYSCHEMA.com/sun/xml/messaging/saaj/soap/Envelope
resolving: class MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory
errors   : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory
    ORA-29534: referenced object MYSCHEMA.com/sun/xml/messaging/saaj/soap/SOAPPartImpl could not be resolved
resolving: class MYSCHEMA.com/sun/xml/messaging/saaj/soap/GifDataContentHandler
resolving: class MYSCHEMA.com/sun/xml/messaging/saaj/soap/JpegDataContentHandler
resolving: class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl
errors   : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl
    ORA-29534: referenced object MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl could not be resolved
errors   : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl
    ORA-29534: referenced object MYSCHEMA.com/sun/xml/messaging/saaj/soap/impl/EnvelopeImpl could not be resolved
errors   : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl$1
    ORA-29534: referenced object MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl could not be resolved
skipping : class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl$2
[snip]
The following operations failed
    class MYSCHEMA.com/sun/xml/messaging/saaj/soap/EnvelopeFactory: resolution
    class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageFactoryImpl: resolution
    class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl: resolution
    class MYSCHEMA.com/sun/xml/messaging/saaj/soap/MessageImpl$1: resolution
[snip]
exiting  : Failures occurred during processing
War es hilfreich?

Lösung

Überprüfen Sie zunächst außerhalb von Oracle, dass sich die Klasse, die Sie suchen, tatsächlich in dieser JAR -Datei befindet. Ich erwarte, dass es so ist, aber es tut nicht weh, zu überprüfen.

Dann würde ich überprüfen, welche Klassen geladen wurden und ob sie gültige Status haben.

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

Vielleicht möchten Sie dies etwas einschränken, wenn es viele Klassen gibt, z. B.:

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

Wenn die Klasse nicht da ist oder sie mit dem falschen Paketnamen vorhanden ist, liegt das Problem mit dem Befehl loadjava.

Wenn die Klasse vorhanden ist, aber ihr Status ungültig ist, überprüfen Sie die Benutzer_Errors, um festzustellen, welche Fehler sind. Ich erinnere mich nicht, ob ich dynamisches Unterricht in Oracle gemacht habe, aber ich erinnere mich, dass statische Verknüpfung Fehler liefern würde, die implizierten, dass eine Klasse nicht existierte, als es wirklich existierte, sondern Fehler hatte.

Neue Informationen nach der Loadjava -Ausgabe gepostet

Die Ausgabe von Loadjava scheint nicht mit Ihrem Versuch nicht zu sein, die Klasse in der Datenbank zu finden. Wenn es geladen, aber nicht gelöst wird, sollte es dennoch aufgeführt werden, jedoch mit einem ungültigen Status.

Ich bekam das Glas und versuchte es selbst in einem leeren Schema. Die Klasse lädt jedoch wie erwartet ungültig:

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

Ich habe dann überprüft, was der Fehler in der Klasse war:

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

(Diese Fehler würden auch in user_errors aufgeführt, vorausgesetzt, die Lösung wurde mindestens einmal versucht.)

Diese Klasse bezieht sich also klar an Klassen aus der Basissoap -Bibliothek. Sie müssten das auch laden - haben Sie das getan?

Zu Ihrer Information, wenn ich einen Code schreibe, um den CLASS.Forname () -Anruf zu machen, bekomme ich die ClassNotFoundException. Das mag kontraintuitiv erscheinen, da das Klassenobjekt im Schema existiert. Eine ungültige Klasse existiert jedoch nicht wirklich aus der Sicht des Klassenladers in Oracle. und damit die Klasse gültig ist, muss Oracle in der Lage sein, alle ihre Verweise auf andere Klassen zu lösen.

Andere Tipps

Ist dies das erste Mal, dass Sie Java in der Datenbank ausführen? Hier ist die Hello World -Implementierung, um sicherzustellen, dass Ihr Oracle JVM ordnungsgemäß ausgeführt wird und Sie über die erforderlichen Berechtigungen verfügen. Sie sagten "Mein Datenbankschema, damit ich tun kann, was ich will" -meinst du nicht, dass du die richtigen Zuschüsse hast.

SQL> create or replace and compile java source named "Hello" as 
   public class Hello{ 
      public static String world() { 
         return "Hello World "; 
      } 
   }; 
/ 

Java created. 

Jetzt die Wrapper -Funktion

SQL> create or replace function Hello RETURN VARCHAR2 
     as LANGUAGE JAVA NAME 'Hello.world() return String'; 
     / 

Function created.

Testen Sie es jetzt

SQL> select Hello from dual; 

HELLO 
----------------------------------- 
Hello World 

Mach das:

try
{
    System.out.println("Class.forName returned: " + 
        Class.forName("com.sun.xml.messaging.saaj.soap.MessageFactoryImpl"));
}
catch(final Throwable ex)
{
    ex.printStackTrace();
    System.exit(1);
}

Nur um 100 und 10% sicher zu sein, dass es keine Ausnahme ausführt, die irgendwie versteckt ist und dass es wirklich null zurückkehrt. Wenn es immer noch der Fall ist, lassen Sie es mich bitte wissen (interessantes Problem, wenn der obige Code funktioniert, aber NULL zurückgibt).

Versuchen Sie # 3 :-) (Ich benutze Oracle nicht ... aber das ist ein ordentliches Problem, um zu debuggen ...)

Hilft die Informationen hier auf class.forname in Oracle?

http://download.oracle.com/docs/cd/b14117_01/java.101/b12021/appover.htm#i1006547

Dies ist als Klassenloader-Problem. Die Lösung ist also in der "echten, nicht orakligen" Welt :-) in den gleichen Weise wie das, was passiert

Bearbeiten ... ein weiterer Versuch ...

Ok, es geht noch etwas an ... Was ist die Ausgabe der folgenden Ausgabe:

System.out.println("vm vendor:     " + System.getProperty("java.vendor"));
System.out.println("vm version:    " + System.getProperty("java.version"));
System.out.println("class version: " + System.getProperty("java.class.version"));

Ich frage mich, ob es ein Problem mit der Klassendateiversion gibt? Haben die Klassendateien eine Version, die nicht auf dem Oracle VM ausgeführt werden kann?

Die Klassenauflösung und -belastung sind komplexe Operationen, die vom VM ausgeführt werden. Der Algorithmus, der von diesen beiden in der Spezifikation beschriebenen Operationen verwendet werden soll, bleibt für VM -Implementierer offen. Ich habe das Gefühl, dass die Auflösung in Ihrem Fall funktioniert, wenn der Operation nur die Verfügbarkeit der Klasse selbst überprüft, während sie später fehlschlägt, wenn versucht wird, die Klasse effektiv zu laden (wahrscheinlich aufgrund fehlender Abhängigkeiten: Wenn die Klasse geladen wird, benötigt die VM zumindest alle direkten Verweise auf andere Klassen zu beheben). Sie müssen sicherstellen, dass alle Klassen Oracle zur Verfügung stehen, und eine schnelle Google-Suche nach ORA-29534 zeigt jede Menge Personen, die dieses Problem haben (und ich bin mir ziemlich sicher, dass jemand es herausgefunden hat).

./Alex

Der Saaj-Impl.jar ist Teil der SAAJ-Komponente des Web Services Developer Pack. Es hat Abhängigkeiten von anderen Gläser, die mit SAAJ versehen, zum Beispiel, es hängt definitiv von Saaj-api.jar und activation.jar ab, meines Wissens. Natürlich ist Saaj-api.jar auch auf viele andere Gläser abhängig.

In Bezug auf JWSDP 1.5 können Sie die Informationen in finden JWSDP 1.5 Release -Notizen um nützlich zu sein. JWSDP 1.6 hat verschiedene Gläser in Saaj. Ich habe die Versionshinweise JWSDP 2.0 in dieser Hinsicht nicht als besonders nützlich gefunden. Übrigens hätte JWSDP 2.0 verschiedene Gläser, die in den Klassenpfad platziert werden sollen. Der Umfang Ihres Problems hängt also schließlich von der Version von SAAJ-Impl.jar ab, die Sie verwenden.

Für den Fall, dass Sie dies möglicherweise benötigen, ist bereits eine Dokumentation verfügbar, wie Sie die SOAP -Client -Gläser in eine Oracle -Datenbank laden und sie auf den folgenden Seiten verwenden können. Ich nehme an, dass sich diese von den Saaj -Gläser unterscheiden, die mit Ihrer Bibliothek geliefert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top