Domanda

Sto cercando di utilizzare una libreria Java di terze parti all'interno di Oracle. La biblioteca sembra compatibile con la stessa versione 1.4 della JVM che i nostri padroni di server Oracle 10g, dal momento che funziona bene al di fuori di Oracle, quindi mi sento come dovrei essere in grado di farlo funzionare. Questa libreria finisce per fare richieste HTTP basati su SOAP, e ottengo errori di risoluzione di classe quando corro in Oracle.

Ecco una linea che mostra la differenza:

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

Ho provato a registrare queste librerie in Oracle con l'utilità loadjava, e ho ottenuto quello che ho pensato che era un risultato positivo:

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

Sembra che tutto ciò che viene caricato, e posso vedere questa classe MessageFactoryImpl in tale elenco. Ma poi cerco di eseguire questa riga di codice da Oracle SQL (all'interno di un'altra classe che ho scritto e caricato con loadjava), questa linea getta una ClassNotFoundException (java.lang.ClassNotFoundException: com / sole / xml / messaggistica / SAAJ / sapone / MessageFactoryImpl ).

Poi sono tornato e ha cercato di aggiungere l'opzione "-resolve" nella riga di comando loadjava. Si comporta come questi SAAJ classi sono di iscriversi, ma non risolvendo correttamente.

Come posso ottenere con successo queste classi SAAJ in Oracle, o se per qualche motivo Oracle ha già questi caricato, come posso convincere il mio codice per utilizzare correttamente la classe esistente?

FWIW, ho già preso le misure per assicurarsi che i permessi sono stati concessi presa appropriate e il mio codice può fare con successo una richiesta HTTP generico per l'URL di destinazione. Ha solo problemi nell'utilizzo dello stack SOAP della biblioteca per farlo accadere.

EDIT: Ecco un esempio di mio risultato loadjava. Questo sembra mostrare esattamente cosa sta mancanza, ma sono confuso sul motivo per cui queste classi particolari non vengono risolti quando sembrano essere gestita correttamente nelle fasi di pre-risoluzione. Ho eliminato circa l'80% del file qui, ma ci sono altre classi che mostrano gli stessi problemi di risoluzione di classe.

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
È stato utile?

Soluzione

Prima di tutto, verifica al di fuori di Oracle che la classe che si sta cercando è in realtà in quel file jar. Mi aspetto lo è, ma non fa male a controllare.

Poi, vorrei verificare quali classi sono stati caricati e se hanno stati validi.

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

Si potrebbe voler limitare questo un po 'se ci sono un sacco di classi, per esempio:.

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

Se la classe non c'è, o è lì con il nome del pacchetto sbagliato, allora il problema è con il comando loadjava.

Se la classe è lì, ma il suo status non è valido, quindi controllare USER_ERRORS per vedere quali sono gli errori. Non ricordo se ho fatto di classe caricamento dinamico all'interno di Oracle, ma ricordo che il collegamento statico darebbe errori che implicava una classe non esisteva quando è realmente esistito ma aveva errori.

Nuova informazioni dopo l'uscita loadjava pubblicato

L'uscita loadjava sembra in contrasto con il tentativo di trovare la classe nel database. Se viene caricato, ma non risolto, dovrebbe ancora essere elencati, ma con uno stato non valido.

Ho ottenuto il JAR e provato io stesso in uno schema vuoto. I carichi di classe, ma non sono validi come previsto:

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

Poi ho controllato ciò che l'errore fosse sulla classe:

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

(Questi errori sarebbe anche essere elencati in USER_ERRORS, risoluzione assumendo ha tentato almeno una volta.)

Quindi, chiaramente questo riferimenti alle classi classi dalla libreria base di sapone. Si dovrà caricare anche questo -? Hai fatto che

Cordiali saluti, quando scrivo un po 'di codice per fare la chiamata Class.forName (), io capisco il ClassNotFoundException. Che può sembrare contro-intuitivo, dato l'oggetto di classe esiste nello schema. Tuttavia, una classe non valida non realmente "esiste" dal punto di vista del caricatore di classe in Oracle; e in modo che la classe sia valido Oracle deve essere in grado di risolvere tutti i suoi riferimenti ad altre classi.

Altri suggerimenti

E 'la prima volta che la vostra esecuzione di Java nel database? Ecco ciao implementazione mondo per assicurarsi che l'Oracle JVM funziona correttamente e si dispone delle autorizzazioni necessarie. Lei ha detto "il mio schema del database, così posso fare quello che voglio" -doesn't significa che devi le sovvenzioni adeguate.

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

Java created. 

Ora la funzione wrapper

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

Function created.

Ora testarlo

SQL> select Hello from dual; 

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

Fare questo:

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);
}

Giusto per essere sicuri 100and10% che non è un'eccezione, che è in qualche modo di essere nascosto e che è davvero tornando nullo. Se è ancora il caso per favore fatemelo sapere (problema interessante se il codice precedente funziona, ma restituisce null).

Prova # 3 :-) (Non faccio uso di Oracle ... ma questo è un problema pulito per eseguire il debug ...)

L'informazioni qui Class.forName in Oracle aiuto?

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

Questo presenta come un problema di ClassLoader, così hoepfully la soluzione è lungo le stesse linee come ciò che accade nel "reale non-Oracle," mondo: -)

Modifica ... un altro tentativo ...

Ok guardando ancora un po '... che cosa è l'uscita dei seguenti:

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"));

Mi chiedo se c'è un problema con la versione del file di classe - fare i file di classe hanno una versione che non può essere eseguito su Oracle VM

?

risoluzione di classe e di carico sono operazioni complesse gestite da VM. L'algoritmo per essere utilizzato da queste 2 operazioni come descritto nelle specifiche viene lasciata aperta per implementatori VM. La mia sensazione è che nel tuo caso la risoluzione funziona come l'operazione controlla solo la disponibilità della classe stessa, mentre si sta venendo a mancare in seguito quando si cerca di caricare in modo efficace la classe (molto probabilmente a causa di dipendenze mancanti: durante il caricamento della classe, le esigenze VM per risolvere almeno tutti i riferimenti diretti alle altre classi). Dovrete fare in modo che tutte le classi sono disponibili per Oracle e l'esecuzione di una rapida ricerca su Google per ORA-29534 mostra tonnellate di persone che hanno questo problema (e sono abbastanza sicuro che qualcuno capito tutto).

./ alex

Il SAAJ-impl.jar fa parte della componente SAAJ del Web Services Developer pacchetto. Ha dipendenze da altri JAR forniti con SAAJ, per esempio, dipende sicuramente su SAAJ-api.jar e activation.jar, a mia conoscenza. Naturalmente, SAAJ-api.jar è destinato a dipendere da un sacco di altri JAR pure.

Per quanto riguarda JWSDP 1.5 è interessato, è possibile trovare le informazioni nella JWSDP 1.5 note di rilascio per essere utile. JWSDP 1.6 ha diversi vasi in SAAJ io havent trovato note di rilascio JWSDP 2.0 essere particolarmente utile in questo senso. BTW, JWSDP 2.0 avrebbe diversi vasi da collocare nel classpath; così la portata del vostro problema alla fine dipende dalla versione di SAAJ-impl.jar che si utilizza.

Nel caso in cui si potrebbe aver bisogno di esso, della documentazione è già disponibile su come caricare i JAR client SOAP in un database Oracle e di utilizzarle, nelle pagine che seguono. Presumo che questi siano diversi dai JAR SAAJ che viene fornito con la libreria però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top