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
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. –
@PatriceM - Entschuldigung; habe vergessen, das zu berücksichtigen. Bearbeiten Sie die ursprüngliche Frage, um sie hinzuzufügen. –
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. –