2012-04-03 18 views
17

Parece que ya hice esto una vez, pero no puedo encontrar ninguna referencia a lo que hice para que funcione.¿Cómo especificar una implementación particular de JAXB?

Tengo una aplicación web en la que deseo especificar una implementación JAXB diferente a la proporcionada por mi servidor web/jre. Descargué el artefacto apropiado de maven, y veo que el contenedor está empaquetado adecuadamente en mi guerra, sin embargo, cuando inicio mi aplicación web, veo que todavía está usando la implementación JRE incluida.

Recuerdo vagamente algo sobre un archivo de propiedades que pude configurar, pero no puedo encontrar una referencia de cómo debe configurarse. Además, si la implementación que deseo utilizar es la misma (solo una versión más nueva), los nombres de las clases serían los mismos que si estuvieran empaquetados en el JRE. ¿Cómo puedo especificar que quiero usar los incluidos en mi WAR?

EDITAR

Actualmente estoy corriendo en JBoss 7.0.2, con Oracle JDK 1.6_0_27, JAXB RI que viene con el JRE (creo que es v2.1). Estoy tratando de actualizar a JAXB RI 2.2.5 (que se encuentra en MvnRepository).

que he hecho un poco más de la excavación de esta mañana, y se dio cuenta un mensaje de error extraño en mis registros:

09:43:18,325 WARN [org.jboss.as.server.deployment] (MSC service thread 1-12) Class Path entry jaxb-api.jar in "/C:/servers/jboss-as-7.0.2.Final/standalone/deployments/LendingSimulationServiceEAR.ear/LendingSimulationService.war/WEB-INF/lib/jaxb-impl-2.2.5.jar" does not point to a valid jar for a Class-Path reference. 
09:43:18,325 WARN [org.jboss.as.server.deployment] (MSC service thread 1-12) Class Path entry activation.jar in "/C:/servers/jboss-as-7.0.2.Final/standalone/deployments/LendingSimulationServiceEAR.ear/LendingSimulationService.war/WEB-INF/lib/jaxb-impl-2.2.5.jar" does not point to a valid jar for a Class-Path reference. 
09:43:18,326 WARN [org.jboss.as.server.deployment] (MSC service thread 1-12) Class Path entry jsr173_1.0_api.jar in "/C:/servers/jboss-as-7.0.2.Final/standalone/deployments/LendingSimulationServiceEAR.ear/LendingSimulationService.war/WEB-INF/lib/jaxb-impl-2.2.5.jar" does not point to a valid jar for a Class-Path reference. 
09:43:18,326 WARN [org.jboss.as.server.deployment] (MSC service thread 1-12) Class Path entry jaxb1-impl.jar in "/C:/servers/jboss-as-7.0.2.Final/standalone/deployments/LendingSimulationServiceEAR.ear/LendingSimulationService.war/WEB-INF/lib/jaxb-impl-2.2.5.jar" does not point to a valid jar for a Class-Path reference. 

que me pareció muy extraño. No estaba seguro de dónde estaba encontrando esa información. Un poco más de investigación encontraron esta línea en el MANIFIEST.MF:

Class-Path: jaxb-api.jar activation.jar jsr173_1.0_api.jar jaxb1-impl.jar 

Así que ahora estoy aún más confundido que nunca. Parece que la implementación de jaxb depende de los archivos jar de implementación api, activation, jsr y jaxb1. Pero no están listados en el jaxb pom. Una pequeña búsqueda en línea me encontró this link que describe cómo usar JAXB 2.2 en un entorno Java6SE. Desafortunadamente, esto tampoco pareció funcionar; Aún recibo los mensajes WARN anteriores.

Estoy usando el siguiente fragmento para enumerar la implementación de JAXB que se está ejecutando; quizás esto es incorrecto?

/** 
* Print the JAXB Implementation information 
*/ 
public static void outputJaxpImplementationInfo() { 
    logger.debug(getImplementationInfo("DocumentBuilderFactory", DocumentBuilderFactory.newInstance().getClass())); 
    logger.debug(getImplementationInfo("XPathFactory", XPathFactory.newInstance().getClass())); 
    logger.debug(getImplementationInfo("TransformerFactory", TransformerFactory.newInstance().getClass())); 
    logger.debug(getImplementationInfo("SAXParserFactory", SAXParserFactory.newInstance().getClass())); 
} 

/** 
* Get the JAXB implementation information for a particular class 
* @param componentName 
* @param componentClass 
* @return 
*/ 
private static String getImplementationInfo(String componentName, Class componentClass) { 
    CodeSource source = componentClass.getProtectionDomain().getCodeSource(); 
    return MessageFormat.format(
      "{0} implementation: {1} loaded from: {2}", 
      componentName, 
      componentClass.getName(), 
      source == null ? "Java Runtime" : source.getLocation()); 
} 

Este fragmento produce el siguiente registro:

10:28:27,402 INFO [stdout] (MSC service thread 1-14) 2012-04-04 10:28:27,402 DEBUG cws.cs.lendingsimulationservice.util.JAXBUtil - DocumentBuilderFactory implementation: __redirected.__DocumentBuilderFactory loaded from: file:/C:/servers/jboss-as-7.0.2.Final/jboss-modules.jar 
10:28:27,403 INFO [stdout] (MSC service thread 1-14) 2012-04-04 10:28:27,403 DEBUG cws.cs.lendingsimulationservice.util.JAXBUtil - XPathFactory implementation: __redirected.__XPathFactory loaded from: file:/C:/servers/jboss-as-7.0.2.Final/jboss-modules.jar 
10:28:27,404 INFO [stdout] (MSC service thread 1-14) 2012-04-04 10:28:27,404 DEBUG cws.cs.lendingsimulationservice.util.JAXBUtil - TransformerFactory implementation: __redirected.__TransformerFactory loaded from: file:/C:/servers/jboss-as-7.0.2.Final/jboss-modules.jar 
10:28:27,406 INFO [stdout] (MSC service thread 1-14) 2012-04-04 10:28:27,406 DEBUG cws.cs.lendingsimulationservice.util.JAXBUtil - SAXParserFactory implementation: __redirected.__SAXParserFactory loaded from: file:/C:/servers/jboss-as-7.0.2.Final/jboss-modules.jar 
+1

Es probable que la implementación de JAXB dependa en cierto grado. Por ejemplo, JAXB RI solía requerir el uso del mecanismo 'endosado' de JRE si se usa la memoria. Por favor, puede especificar los detalles de su entorno: servidor de aplicaciones, versión JDK, formulario JAXB impl/para comenzar. –

+0

@PatriceM - lo siento; Olvidé incluir eso. Acabo de editar la pregunta original para agregarla. –

+0

Edité la publicación original para agregar algo de información adicional para indicar cómo obtengo la implementación de JAXB, así como un enlace que indica cómo la implementación predeterminada de JAXB de JRE no parece ser trabajando. –

Respuesta

12

Nota: Soy el EclipseLink JAXB (MOXy) de plomo y un miembro del grupo de expertos JAXB 2 (JSR-222).

Para especificar una implementación de JAXB (JSR-222) distinta de la predeterminada, debe incluir un archivo llamado jaxb.properties en el mismo paquete que las clases de su dominio. El siguiente es un ejemplo del archivo jaxb.properties utilizado para especificar la aplicación moxy de JAXB:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

Para más información

+4

Gracias por la propina; Creo que eso es lo que estaba tratando de recordar. Pero dada la misma clase tanto en un JRE como en tu guerra, ¿cómo especificas usar la clase en la guerra contra la de la jre o el servidor de la aplicación proveedora? –

+0

¿hubiera funcionado esto? compilar Compilar significa que necesita el JAR para compilar y ejecutar la aplicación. Para una aplicación web, como ejemplo, el JAR se colocará en el directorio WEB-INF/lib. – aurelius

2

Es posible cargar la aplicación JAXB desde una biblioteca específica usando el Java Endorsed Standards Override Mechanism.Esto también se sugiere en la guía Using JAXB 2.1/2.2 with JavaSE 6.

De forma alternativa, en su servidor de aplicaciones puede modificar la política de carga de clases de su aplicación al último para que las clases se busquen primero en las bibliotecas incluidas con su aplicación antes de buscarlas en JRE.

Cuestiones relacionadas