java - run - JAXBException al crear el contexto JAXB
run jnlp (5)
Cuando ejecuto la aplicación como programa Java independiente, funciona bien. Cuando lo ejecuto como un applet, arroja JAXBException con la siguiente stacktrace.
javax.xml.bind.JAXBException: jaxb.properties in package com/test/package does not contain the javax.xml.bind.context.factory property.
at javax.xml.bind.ContextFinder.find(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
Cuando agrego un jaxb.properties, obtengo el siguiente error:
javax.xml.bind.JAXBException
- with linked exception:
[java.lang.NoSuchMethodException: com.sun.xml.internal.ws.developer.JAXBContextFactory.createContext([Ljava.lang.Class;, java.util.Map)]
at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
at javax.xml.bind.ContextFinder.find(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
Agregué los siguientes jar a classpath -
- jaxws-rt-2.2.1
- jsr311-api-1.1.1
- jersey-core-1.2
- jersey-client-1.2
¿Qué causa este error? ¿Me falta alguna dependencia?
Editar: estoy usando Java 7 u 59 tanto en el navegador como en el entorno de desarrollo.
La versión 1.2 de Jersey parece obsoleta. Creo que Jersey 2.21 es la versión actual. Además, debe inspeccionar qué JDK / JRE está utilizando para ejecutar su programa. ¿El applet se ejecuta en el mismo entorno / versión de Java que cuando lo iniciaste como una aplicación?
De la excepción, llegué a saber que su WS se está refiriendo a java rt.jar y no se refiere al jar agregado por usted en el classpath.
Así que de esto puedo concluir que el jar no se coloca exactamente en el classPath.
Segunda excepción: Verifique que la clase sea referida desde qué jar y reemplace el archivo jar apropiado que tiene el método createjaxbcontext.
Use la versión correcta de jar en classpath (jaxws-rt).
En base a su información provista, aquí están mis entradas. Tenga en cuenta todo lo que requiera su entrada / you-to-try-out, lo he marcado como <try-out>
.
Primero <try-out>
siguiente:
a. Verifique que no vea varias versiones de Java como verificadas en el interior: widnows-> panel de control-> java-> java tab-> ver las ubicaciones de Java. Básicamente, esto es para garantizar que su aplicación java y su applet usen el mismo JRE.
En cuanto a su primera excepción: javax.xml.bind.JAXBException: jaxb.properties in package com/test/package does not contain the javax.xml.bind.context.factory property
Este es un problema de JRE que no puede ubicar una implementación de JAXB. Vaya a la URL y busque la sección "Descubrimiento de la implementación de JAXB". Menciona que después de 4 ubicaciones se utilizan para identificar la implementación de JAXB:
- Encontrar jaxb.properties en el directorio del paquete
- Propiedad del sistema JAXB_CONTEXT_FACTORY
- Buscando el archivo /META-INF/services/javax.xml.bind.JAXBContext en todos los archivos jar
- Implementación específica de JVM por defecto.
Ahora está recibiendo esta excepción solo en el caso de Applet NO para la aplicación JAVA. Mencionaste que tanto la aplicación java como el applet están usando el mismo JDK + jar adicionales. La única razón por la que puedo pensar en la diferencia entre el applet y el entorno de la aplicación podría deberse al punto 2 anterior.
<try-out>
siguiente:
b.Puede verificar si está especificando JAXB_CONTEXT_FACTORY como propiedad del sistema cuando ejecuta la aplicación Java (quizás a través de eclipse o algo así)
do. Puede ser que pueda imprimir todas las propiedades del sistema en su código:
Properties props = System.getProperties();
props.list(System.out);
y verificar si la fábrica de contexto JAXB está configurada allí o no?
Con respecto a su segunda excepción: después de agregar el archivo jaxb.properties, recibió su segunda excepción. Podría deberse al siguiente motivo: - el seguimiento de la pila de excepción muestra que puede haber especificado com.sun.xml.internal.ws.developer.JAXBContextFactory
en el archivo JAXB.properties
. Ahora, si vuelve a ver la URL y busca el primer REQUERIMIENTO DE ESPECIFICACIONES para el proveedor de JAXBContext: el proveedor debe proporcionar una clase de implementación que contenga las siguientes firmas de método:
public static JAXBContext createContext( Class[] classes, Map<String,Object> properties ) throws JAXBException
Además, si googleas contenido de la clase com.sun.xml.internal.ws.developer.JAXBContextFactory
, puedes ver en este sitio que esta clase NO contiene el método createConext()
; solo define una llamada a método createJAXBContext(
). Tenga en cuenta que esta clase es llamada internamente por com.sun.xml.internal.bind.api.JAXBRIContext
que extensión de la clase javax.xml.bind.JAXBContext
.
<try-out>
siguiente:
re. debe especificar un valor apropiado de javax.xml.bind.context.factory
en el archivo jaxb.properties
que apunta a una clase que implementa la operación createConext()
.
Finalmente, el último punto: existe la posibilidad de que especifique la fábrica correcta en jaxb.properties
pero su valor puede no ser elegido por el tiempo de ejecución y en su lugar, el tiempo de ejecución elige el valor de implementación JAXB de otros mecanismos especificados en los puntos 1 a 4. Este puede ser el caso de múltiples implementaciones de fábrica de JAXB presentes en el tiempo de ejecución de JVM.
<try-out>
siguiente:
mi. En tales situaciones, es mejor utilizar el mecanismo de anulación endosada de Java como se especifica en esta publicación.
Primero, debes verificar si estás usando el mismo JRE. Puedes hacer eso aquí. Y como mencionó @LarsGendner, descargue JAXB 2.2. * Jar, porque 1.2 está desactualizado.
Segundo: Mira este tema: ¿Cómo puedo usar JAXB desde un applet sin firmar (sin firmarlo)?