Pregunta

Estoy intentando utilizar una biblioteca Java de terceros dentro de Oracle.La biblioteca parece compatible con la misma versión 1.4 de jvm que aloja nuestro servidor Oracle 10g, ya que funciona bien fuera de Oracle, por lo que siento que debería poder hacer que esto funcione.Esta biblioteca termina realizando solicitudes http basadas en SOAP y obtengo errores de resolución de clases cuando la ejecuto en Oracle.

Aquí hay una línea que muestra la diferencia:

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

Intenté registrar estas bibliotecas en Oracle con la utilidad loadjava y obtuve lo que pensé que era un resultado exitoso:

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

Parece que todo se carga y puedo ver esta clase MessageFactoryImpl en esa lista.Pero luego intento ejecutar esta línea de código desde Oracle SQL (dentro de otra clase que escribí y cargué con loadjava), esta línea arroja una ClassNotFoundException (java.lang.ClassNotFoundException:es/sun/xml/messaging/saaj/soap/MessageFactoryImpl).

Luego volví e intenté agregar el modificador "-resolve" en la línea de comando loadjava.Parece que estas clases de saaj se están registrando, pero no se resuelven correctamente.

¿Cómo puedo introducir con éxito estas clases saaj en Oracle, o si por alguna razón Oracle ya las tiene cargadas, ¿cómo puedo convencer a mi propio código para que utilice correctamente la clase existente?

FWIW, ya tomé las medidas necesarias para asegurarme de que se otorgaran los permisos de socket adecuados y que mi código pueda realizar con éxito una solicitud http genérica a la URL de destino.Simplemente tiene problemas para usar la pila SOAP de la biblioteca para que esto suceda.

EDITAR:Aquí hay una muestra de mi resultado de loadjava.Esto parece mostrar exactamente qué está fallando, pero no sé por qué estas clases en particular no se resuelven cuando parecen manejarse correctamente en los pasos previos a la resolución.Eliminé aproximadamente el 80% del archivo aquí, pero hay otras clases que muestran los mismos problemas de resolución de clases.

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
¿Fue útil?

Solución

En primer lugar, compruebe fuera de Oracle que la clase que busca es en realidad en ese archivo JAR. Espero que lo es, pero no hace daño a comprobar.

A continuación, me gustaría comprobar lo que las clases se han cargado y si tienen estados válidos.

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

Es posible que desee limitar esta un poco si hay una gran cantidad de clases, por ejemplo:.

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

Si la clase no está allí, o que está allí con el nombre del paquete equivocado, entonces el problema es con el comando loadjava.

Si la clase está ahí, pero su condición no es válida, compruebe USER_ERRORS para ver lo que los errores son. No recuerdo si he hecho carga dinámica de clases dentro de Oracle, pero recuerdo que la vinculación estática daría errores que implicaba que no existía una clase, cuando en realidad existía, pero tenía errores.

Nueva información después de la salida loadjava publicado

La salida loadjava parece inconsistente con su intento de encontrar la clase en la base de datos. Si se carga pero no se resuelve, todavía debe aparecer, pero con un estado no válido.

Tengo el frasco y probado a mí mismo en un esquema vacío. Las cargas de clase, pero no son válidos como se espera:

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

Entonces comprobé lo que fuera el error en la clase:

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

(Estos errores también sería enumeran en USER_ERRORS, suponiendo que se intentó resolver al menos una vez.)

Así que claramente esta especificación cita clase clases de la biblioteca de SOAP base. Usted tendría que cargar eso también - has hecho eso

Para su información, cuando escribo algo de código para hacer la llamada Class.forName (), me pongo el ClassNotFoundException. Que puede parecer contrario a la intuición ya la clase de objeto no existe en el esquema. Sin embargo, una clase no válida en realidad no "existe" desde el punto de vista del cargador de clases en Oracle; y para que la clase sea válida Oracle tiene que ser capaz de resolver todas sus referencias a otras clases.

Otros consejos

¿Es la primera vez que su ejecución de Java en la base de datos? Aquí es hola aplicación mundo para asegurarse de que su Oracle JVM está funcionando correctamente y usted tiene los permisos necesarios. Usted ha dicho "mi esquema de la base, por lo que puede hacer lo que quiera" -doesn't significa que tenga las subvenciones adecuadas.

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

Java created. 

Ahora, la función de contenedor

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

Function created.

Ahora probarlo

SQL> select Hello from dual; 

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

Haga lo siguiente:

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

Sólo para estar 100and10% seguro de que no está lanzando una excepción que de alguna manera se está ocultando y que realmente se vuelve nula. Si todavía es el caso, por favor hágamelo saber (problema interesante si el código anterior funciona, pero devuelve un valor nulo).

Trate # 3 :-) (no uso de Oracle ... pero esto es un problema ordenada de depurar ...)

¿La información aquí en Class.forName en Oracle ayuda?

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

Esto presenta como un problema de cargador de clases, por lo que la solución es hoepfully lo largo de las mismas líneas que lo que sucede en el mundo "real, no Oracle": -)

Editar ... otra oportunidad ...

Ok mirarlo un poco más ... ¿cuál es la salida de los siguientes:

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

Me pregunto si hay un problema con la versión del archivo de clase - hacer los archivos de clase tienen una versión que no se puede ejecutar en la máquina virtual de Oracle

?

resolución de clase y la carga son operaciones complejas manejados por la máquina virtual. El algoritmo para ser utilizado por estas 2 operaciones como se describe en la especificación se deja abierta para implementadores VM. Mi sensación es que, en su caso, la resolución funciona como la operación sólo comprueba la disponibilidad de la propia clase, mientras que está fallando más adelante cuando se trata de cargar con eficacia la clase (muy probablemente debido a las dependencias que faltan: al cargar la clase, las necesidades de VM para resolver al menos todas las referencias directas a otras clases). Usted tiene que asegurarse de que todas las clases están disponibles para Oracle y realizar una rápida búsqueda en Google para ORA-29534 muestra un montón de personas que tienen este problema (y estoy bastante seguro de que alguien lo descubrió).

./ Alex

El saaj-impl.jar es parte del componente SAAJ del Paquete de Servicios Web Developer. Se tiene dependencias en otros archivos JAR que se incluyen con SAAJ, por ejemplo, que sin duda depende de saaj-api.jar y activation.jar, que yo sepa. Por supuesto, saaj-api.jar está obligado a depender de una gran cantidad de otros códigos JAR también.

En lo que se refiere JWSDP 1.5, se puede encontrar la información en el JWSDP 1.5 Notas de la versión para ser útil. JWSDP 1.6 tiene diferentes frascos en SAAJ Havent encontró el Release JWSDP 2.0 Notas a ser particularmente útil en este sentido. Por cierto, JWSDP 2.0 tendría diferentes JAR para ser colocados en la ruta de clase; por lo que el alcance de su problema depende finalmente de la versión de saaj-impl.jar que utilice.

Sólo en caso de que debe de estar, algún tipo de documentación ya está disponible en la forma de cargar los archivos JAR de cliente SOAP en una base de datos de Oracle y de utilizarlos, en las siguientes páginas. Supongo que éstas sean diferentes de los JAR SAAJ que viene con su biblioteca sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top