Подтвердить что ты не робот

Как указать конкретную реализацию JAXB?

Кажется, что я уже делал это один раз в прошлом, но я не могу найти ссылку на то, что я сделал, чтобы заставить его работать.

У меня есть веб-приложение, в котором я хочу указать другую реализацию JAXB, чем тот, который предоставляется моим веб-сервером/jre. Я загрузил соответствующий артефакт из maven и увидел, что банка правильно упакована в моей войне, однако, когда я запускаю свое веб-приложение, я вижу, что он все еще использует встроенную реализацию JRE.

Я смутно помню что-то о файле свойств, который я мог бы настроить, но не могу найти ссылку на то, как его нужно настроить. Более того, если реализация, которую я хочу использовать, такая же (просто более новая версия), имена классов будут такими же, как если бы они были упакованы в JRE. Как я могу указать, что я хочу использовать те, которые были включены в мою WAR?

ИЗМЕНИТЬ

В настоящее время я работаю на JBoss 7.0.2, с Oracle JDK 1.6_0_27, JAXB RI, который поставляется с JRE (я думаю, это v2.1). Я пытаюсь перейти на JAXB RI 2.2.5 (находится в MvnRepository).

Сегодня утром я сделал еще немного копания и заметил в моих журналах странное сообщение об ошибке:

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.

Что я нашел очень странным. Я не был уверен, где он нашел эту информацию. Немного больше исследований нашли эту строку в MANIFEST.MF:

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

Итак, теперь я еще более смущен, чем когда-либо. Похоже, что реализация jaxb зависит от jAp и jaxb1. Но они не указаны в jaxb pom. Немного копания в сети нашла меня эта ссылка, в которой обсуждается, как использовать JAXB 2.2 в среде Java6SE. К сожалению, это тоже не сработало; Я все еще получаю вышеуказанные WARN сообщения.

Я использую следующий фрагмент, чтобы перечислить выполняемую JAXB-реализацию; возможно, это неверно?

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

Этот фрагмент создает следующий журнал:

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
4b9b3361

Ответ 1

Примечание. Я EclipseLink JAXB (MOXy) и член JAXB 2 (JSR-222).

Чтобы указать реализацию JAXB (JSR-222), отличную от по умолчанию, вам необходимо включить файл с именем jaxb.properties в том же пакете, что и ваши классы домена. Ниже приведен пример файла jaxb.properties, который используется для указания MOXy-реализации JAXB:

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

Дополнительная информация

Ответ 2

Можно загрузить реализацию JAXB из конкретной библиотеки, используя механизм переопределения стандартов Java, одобренных API. Это также предлагается в руководстве Использование JAXB 2.1/2.2 с JavaSE 6.

В качестве альтернативы, на вашем сервере приложений вы можете изменить политику класса-загрузчика для вашего приложения на родительский последний, чтобы классы сначала просматривались в библиотеках в комплекте с вашим приложением до поиска в JRE.