jboss 如何指定一个特定的JAXB实现?

zpf6vheq  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(105)

好像我过去已经这样做过一次,但我找不到任何参考资料,说明我做了什么才能让它发挥作用。
我有一个Web应用程序,我想在其中指定一个不同于Web服务器/jre提供的JAXB实现。我从maven下载了相应的工件,并看到jar在我的war中被正确打包,然而,当我启动我的web应用程序时,我看到它仍然使用捆绑的JRE实现。
我依稀记得一些关于我可以配置的属性文件,但找不到关于如何配置它的参考。此外,如果我想使用的实现是同一个(只是一个较新的版本),那么类名称将与JRE中打包的相同。我如何指定我想使用WAR中捆绑的那些?

编辑

我目前运行的是JBoss 7.0.2,Oracle JDK 1.6_0_27,JRE附带的JAXB RI(我认为是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实现依赖于API、激活、jsr和jaxb 1实现jar。但它们没有列在jaxb pom中。我在网上查了一下this link,它讨论了如何在Java 6SE环境中使用JAXB 2.2。不幸的是,这似乎也不起作用;我仍然收到上面的警告信息。
我使用下面的代码片段列出正在运行的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
l5tcr1uw

l5tcr1uw1#

* MOXy*

**注意:我是JooseLink JAXB(MOXy)**的负责人,也是JAXB 2 (JSR-222)Maven组的成员。

要指定JAXB(JSR-222)实现而不是默认实现,您需要在与域类相同的包中包含一个名为jaxb.properties的文件。下面是用于指定JAXB的MOXy实现的jaxb.properties文件的示例:

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

更多信息

wwwo4jvm

wwwo4jvm2#

可以使用Java Endorsed Standards Override Mechanism从特定库加载JAXB实现。这也是在Using JAXB 2.1/2.2 with JavaSE 6指南中建议的。
或者,在应用程序服务器中,您可以将应用程序的类加载器策略修改为最后生成父类,以便在JRE中搜索类之前,首先在与应用程序捆绑的库中查找类。

相关问题