我花了一天时间调试 JAXB 导致命名空间错误或丢失的问题(可能与 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 放在我认可的目录中,就会出现问题。如果 1.6.0_27 确实使用等效的 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 版本是什么?