2012-04-03 1 views
17

Es scheint, als ob ich das schon einmal in der Vergangenheit getan habe, aber ich kann keinen Hinweis darauf finden, was ich getan habe, um es zum Laufen zu bringen.Wie spezifiziert man eine bestimmte JAXB-Implementierung?

Ich habe eine Webanwendung, in der ich eine andere JAXB-Implementierung angeben möchte als die, die von meinem Webserver/jre bereitgestellt wird. Ich habe das entsprechende Artefakt von Maven heruntergeladen und gesehen, dass das Glas in meinem Krieg richtig verpackt ist. Beim Starten meiner Web-App sehe ich jedoch, dass es immer noch die gebündelte JRE-Implementierung verwendet.

Ich erinnere mich vage an etwas über eine Eigenschaftendatei, die ich konfigurieren konnte, kann aber keinen Verweis darauf finden, wie es konfiguriert werden muss. Wenn die Implementierung, die ich verwenden möchte, die gleiche ist (nur eine neuere Version), wären die Klassennamen die gleichen wie in der JRE. Wie kann ich angeben, dass ich die in meinem WAR gebündelten verwenden möchte?

EDIT

ich zur Zeit läuft auf JBoss 7.0.2 mit Oracle JDK 1.6_0_27, JAXB RI, die mit der JRE kommt (ich glaube, es ist v2.1). Ich versuche ein Upgrade auf JAXB RI 2.2.5 (gefunden auf MvnRepository).

Ich habe ein wenig mehr zu graben heute Morgen getan, und bemerkte in meinem Logs eine seltsame Fehlermeldung:

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. 

Was ich sehr seltsam gefunden. Ich war mir nicht sicher, wo ich diese Informationen finden sollte. Ein wenig mehr Forschung fand diese Zeile in der MANIFEST.MF:

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

So jetzt bin ich noch verwirrter als je zuvor. Es scheint, dass die Jaxb-Implementierung von den Implementierungs-JARs api, activation, jsr und jaxb1 abhängt. Aber sie sind nicht in der Jaxb Pom aufgeführt. Ein wenig graben online fand mich this link, die diskutiert, wie JAXB 2.2 in einer Java6SE-Umgebung zu verwenden. Leider schien das auch nicht zu funktionieren; Ich bekomme immer noch die oben genannten WARN-Nachrichten.

Ich benutze das folgende Snippet, um die JAXB-Implementierung aufzulisten, die ausgeführt wird; vielleicht ist das falsch?

/** 
* 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()); 
} 

Dieser Code-Schnipsel erzeugt das folgende Protokoll:

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 ist wahrscheinlich JAXB Implementierung abhängig von einem gewissen Grad. Zum Beispiel erforderte der JAXB RI früher die Verwendung des JRE "Indossiert" -Mechanismus, wenn der Speicher dient. Können Sie bitte die Details Ihrer Umgebung angeben: App-Server, JDK-Version, JAXB impl form/to. –

+0

@PatriceM - Entschuldigung; habe vergessen, das zu berücksichtigen. Bearbeiten Sie die ursprüngliche Frage, um sie hinzuzufügen. –

+0

Ich habe den ursprünglichen Beitrag bearbeitet, um zusätzliche Informationen hinzuzufügen, um anzugeben, wie die JAXB-Implementierung verwendet wird, sowie einen Link, der anzeigt, dass das Überschreiben der JRE-JAXB-Implementierung nicht zu sein scheint Arbeiten. –

Antwort

12

Hinweis: Ich bin das EclipseLink JAXB (MOXy) Blei und ein Mitglied der JAXB 2 (JSR-222) Expertengruppe.

Um eine andere JAXB (JSR-222) Implementation als die Standardeinstellung anzugeben, müssen Sie eine Datei mit dem Namen jaxb.properties im selben Paket wie Ihre Domänenklassen einschließen. Das Folgende ist ein Beispiel für die jaxb.properties Datei verwendet, um die moxy Implementierung von JAXB angeben:

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

Weitere Informationen

+4

Danke für den Tipp; Ich denke, das ist es, woran ich mich zu erinnern versuchte. Aber wenn Sie die gleiche Klasse sowohl in einer JRE als auch in Ihrem Krieg angeben, wie spezifizieren Sie die Verwendung der Klasse im Krieg gegenüber der im jre oder dem Bereitstellungs-App-Server? –

+0

hätte dies funktioniert? kompilieren Kompilieren bedeutet, dass Sie das JAR zum Kompilieren und Ausführen der App benötigen. Für eine Webanwendung wird das JAR beispielsweise im Verzeichnis WEB-INF/lib abgelegt. – aurelius

2

Es ist möglich, JAXB Umsetzung zu laden aus einer spezifischen Bibliothek mit der Java Endorsed Standards Override Mechanism.Dies wird auch in der Anleitung Using JAXB 2.1/2.2 with JavaSE 6 vorgeschlagen. Alternativ können Sie auf Ihrem Anwendungsserver die Class-Loader-Richtlinie für Ihre Anwendung als letzte übergeordnete Klasse ändern, sodass Klassen zuerst in den mit Ihrer Anwendung gebündelten Bibliotheken nachgeschlagen werden, bevor sie in JRE durchsucht werden.