jaxb - xjc -version 可以信任吗?

标签 jaxb java jaxb2

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

我发现问题出现在我认可的目录中的 JAXB RI 2.1.10 中。

如果我使用 JAXB RI 2.2.4 或 2.2.6,它是固定的

这才是真正令人困惑的地方(以及它花了这么长时间的原因)。

在以下 JDK 中使用 JAXB 的 Linux 上出现问题(即 nothing in endorsed):

$ 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。

同样,我无法在 Windows 上使用 Java 1.6.0_27 重现该问题(我认可的目录中没有任何内容),报告:

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 注册机放入我认可的目录中,就会出现问题。它应该出现在 1.6.0_27 中,如果它确实使用了 JAXB RI 2.1.10 的等价物。

在我看来,我遇到的问题已在 2.1.10 之后和 2.2.4 之前的某个地方的引用实现中得到修复,但是上面的 2 个虚拟机实际上都没有使用他们声称的 JAXB 版本。或者他们可能使用他们声称的 xjc,但不是 jaxb-api.jar 和 jaxb-impl.jar 中的内容(我知道 namespace 前缀映射器属性和包名称存在差异,但这不会造成这个问题)。

我已经在 Win 7 和 Ubuntu、tomcat(没有 eclipse)和 eclipse(没有 tomcat)中完成了这些实验,所以我非常有信心我正确地解释了我的发现。

任何人都可以深入了解正在发生的事情吗?

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

最佳答案

xjc -version 可以信任吗?

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


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

否:

  • 不要求 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

关于jaxb - xjc -version 可以信任吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12562371/

相关文章:

java - 使用maven编译时将xml文件从src/复制到class/

java - Processing 3.0 方法 PVector.get() 已弃用

java - 在 Spring MVC Controller 中注入(inject) Jaxb2Marshaller

java - 使用 Axis2 - AXIOM、JAXB、ADB 或 XMLBeans 构建 Web 服务对我来说什么是正确的选择

java - ERROR : Property appears in @XmlType. propOrder,但不存在此类属性

java - RecyclerView 没有在底部调用 onScrolled

java - 是否可以在不使用CharacterEscapeHandler的情况下使用CDATA在JAXB中进行编码和解码

Spring 3、JAXB2、Java 6、NamespacePrefixMapper 问题

java - 解析 XML 时的问题

java - 如何让 JAXB 解析 BigInteger 的科学记数法?