5

私は、JAXB が名前空間を間違って取得したり欠落したりする問題のデバッグに 1 日を費やしました (おそらく Marshaller.JAXB_FRAGMENT に関連していますが、それはここでは重要ではありません)。

この問題は、承認済みディレクトリの JAXB RI 2.1.10で発生することがわかりました。

JAXB RI 2.2.4 または 2.2.6 を使用すると修正されます

これが本当に紛らわしいことです(そして、時間がかかった理由です)。

この問題は、次の JDK の JAXB を使用する Linux で発生します (つまり、何も保証されていません)。

$ java -version
java version "1.7.0_03"
OpenJDK Runtime Environment (IcedTea7 2.1.1pre) (7~u3-2.1.1~pre1-1ubuntu2)
OpenJDK 64-Bit Server VM (build 22.0-b10, mixed mode)

$ xjc -version
xjc 2.2.4

しかし、この Java が実際に RI 2.2.4 と同じ JAXB を使用している場合、問題なく動作するはずです。

私がデバッグしていた問題は xjc とは何の関係もないことに注意してください。そのコマンドを使用して、使用している JAXB のバージョンを確認しようとしています。

同様に、Java 1.6.0_27 を使用した Windows で問題を再現できません (私の承認済みディレクトリには何もありません)。

C:\Program Files\Java\jdk1.6.0_27\bin>java -version
java version "1.6.0_27"
Java(TM) SE Runtime Environment (build 1.6.0_27-b07)
Java HotSpot(TM) 64-Bit Server VM (build 20.2-b06, mixed mode)

C:\Program Files\Java\jdk1.6.0_27\bin>xjc -version
xjc version "JAXB 2.1.10 in JDK 6"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build JAXB 2.1.10 in JDK 6)

それでも、承認済みのディレクトリに 2.1.10 RI を配置すると、問題が発生します。JAXB RI 2.1.10 と同等のものを実際に使用している場合、1.6.0_27 で発生するはずです。

私が経験している問題は、2.1.10 以降および 2.2.4 以前のリファレンス実装で修正されているように思えますが、上記の 2 つの VM のどちらも、主張して​​いる JAXB バージョンを実際に使用していません。または、彼らが主張する xjc を使用している可能性がありますが、jaxb-api.jar と jaxb-impl.jar にあるものは使用していません (名前空間プレフィックス マッパー プロパティとパッケージ名に違いがあることは知っていますが、そうではありませんこの問題の原因)。

これらの実験は、Win 7 と Ubuntu、Tomcat (Eclipse なし)、および Eclipse (Tomcat なし) で行ったので、自分の発見を正しく説明していると確信しています。

誰でも何が起こっているのかについての洞察を提供できますか?

私が正しければ、さまざまな Sun/Oracle JDK が実際に使用している JAXB のバージョンを知っている人はいますか?

4

1 に答える 1

4

xjc -version信頼できますか?

はい。XJCツールのバージョンが表示されます。


JAXB(JSR-222)ランタイム実装xjc -versionのバージョンを提供することを信頼できますか?

いいえ:

  • XJCツールのバージョンがJAXBランタイム実装のバージョンと一致する必要はありません。
  • また、XJCツールとJAXBランタイム実装がJAXBの同じ実装からのものである必要はありません。たとえば、XJCツールはProject JAXBから取得でき、ランタイムはEclipseLink JAXB(MOXy)である可能性があります。

JDK/JREに含まれるJAXBRIおよびJAXBImpl

Java SE実装(バージョン6以降)には、JAXBのバージョン(JSR-222)を含める必要があります。多くの場合(必須ではありませんが)含まれているのは、JAXBRIのパッケージ名が変更されたバージョンです。したがって、以下を実行すると、次のようになります。

import javax.xml.bind.JAXBContext;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Demo.class);
        System.out.println(jc.getClass());
    }

}

あなたが得る:

class com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl

JAXB-RIのバージョンをダウンロードしてクラスパスに追加し、同じデモコードを再実行すると、出力は次のように変わります。

class com.sun.xml.bind.v2.runtime.JAXBContextImpl
于 2012-09-28T11:34:56.050 に答える