web-dev-qa-db-ja.com

特定のJAXB実装を指定する方法は?

過去に一度これを行ったことがあるようですが、それを機能させるために行ったことへの参照は見つかりません。

Webサーバー/ jreが提供するものとは異なるJAXB実装を指定したいWebアプリケーションがあります。 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、activation、jsr、jaxb1の実装jarに依存しているようです。しかし、それらはjaxb pomにリストされていません。オンラインで少し調べてみたところ、 このリンク は、Java6SE環境でJAXB 2.2を使用する方法について説明しています。残念ながら、これも機能していないようです。上記の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
21
Eric B.

注:私は EclipseLink JAXB(MOXy) リードおよび JAXB 2(JSR-222) 専門家グループのメンバー。

デフォルト以外のJAXB(JSR-222)実装を指定するには、ドメインクラスと同じパッケージにjaxb.propertiesというファイルを含める必要があります。以下は、JAXBのMOXy実装を指定するために使用されるjaxb.propertiesファイルの例です。

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

詳細情報

13
bdoughan

Java Endorsed Standards Override Mechanism を使用して、特定のライブラリーからJAXB実装をロードすることが可能です。これは、ガイド JavaSE 6でのJAXB 2.1/2.2の使用 でも提案されています。

または、アプリケーションサーバーで、アプリケーションのクラスローダーポリシーを最後に親に変更して、クラスがJREで検索される前に、アプリケーションにバンドルされているライブラリで最初に検索されるようにすることもできます。

2
Somu