xjc -version可以信任吗?

时间:2012-09-24 09:36:47

标签: jaxb java jaxb2

我花了一天时间调试JAXB的问题,导致命名空间错误或丢失(可能与Marshaller.JAXB_FRAGMENT相关,但这不是重点)。

我发现在我的背书目录中,JAXB RI 2.1.10 会出现问题。

如果我使用JAXB RI 2.2.4或2.2.6

,则会修复

这是真正令人困惑的事情(以及需要这么长时间的事情)。

问题出现在Linux上,JAXB在以下JDK中(即没有任何背书):

$ 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放在我认可的目录中,则会出现问题。它应该发生在1.6.0_27,,如果它真的使用相当于JAXB RI 2.1.10。

在我看来,我遇到的问题已经在2.1.10之后和2.2.4之前的某个地方的参考实现中得到修复,但是上面的两个虚拟机实际上都没有使用他们声称的JAXB版本。或者他们可能使用他们声称的xjc,但不是jaxb-api.jar和jaxb-impl.jar中的内容(我知道命名空间前缀mapper属性和包名中有区别,但是不会造成这个问题)。

我在Win 7和Ubuntu,tomcat(没有eclipse)和eclipse(没有tomcat)上做过这些实验,所以我非常有信心我正确地解释了我的发现。

任何人都可以提供有关正在发生的事情的任何见解吗?

如果我是对的,有没有人知道各种Sun / Oracle JDK真正使用的JAXB版本?

1 个答案:

答案 0 :(得分:4)

可以信任xjc -version吗?

YES。它将为您提供XJC工具的版本。


可以信任xjc -version来提供JAXB (JSR-222)运行时实施的版本吗?

NO:

  • 不要求XJC工具的版本与JAXB运行时实现的版本匹配。
  • 也不要求XJC工具和JAXB运行时实现来自JAXB的相同实现。例如,XJC工具可以来自Project JAXB,运行时可以是EclipseLink JAXB (MOXy)

JAXB RI和JDK / JRE中包含的JAXB Impl

Java SE实现(版本6及更高版本)需要包含JAXB(JSR-222)的版本。通常(但不是必须)包含的是JAXB RI的包重命名版本。因此,如果您运行以下内容:

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