当前位置: 首页 > 知识库问答 >
问题:

xjc-version可以信任吗?

仲孙凡
2023-03-14

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

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

如果我使用 JAXB RI 2.2.4 或 2.2.6,则此问题已修复

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

该问题发生在以下JDK中的JAXBLinux上(即没有被认可):

$ 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上复制Java1.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 RI放在我认可的目录里,问题就发生了。它应该发生在 1.6.0_27 中,如果它确实使用了 JAXB RI 2.1.10 的等效项。

在我看来,我遇到的问题已经在2.1.10之后和2.2.4之前的参考实现中得到了解决,但上面的两个虚拟机都没有实际使用它们声称的JAXB版本。或者它们可能使用它们宣称的xjc,但没有使用JAXB-api中的版本。jar和jaxb实现。jar(我知道名称空间前缀映射器属性和包名称存在差异,但这不会导致此问题)。

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

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

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

共有1个答案

常波
2023-03-14

< code>xjc -version可信吗?

是的。它会给你XJC工具的版本。

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

不:

  • XJC 工具的版本不要求与 JAXB 运行时实现的版本匹配。
  • 也不要求 XJC 工具和 JAXB 运行时实现来自 JAXB 的同一实现。例如,XJC 工具可能来自 JAXB 项目,运行时可以是日食链接 JAXB(MOXY)。

JDK/JRE中包含的JAXB RI和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
 类似资料:
  • web3.version属性记录了web3容器对象的版本。 调用方法: Web3.version web3.version 返回值: String: 当前版本字符串 示例代码: web3.version; > "1.0.0"

  • 问题内容: 我们的项目使用XJC从XSD生成Java类。我正在使用JAVA EE 6。 当我们所有的XSD重新生成时,生成的类在文件顶部包含以下注释: 是否可以取消此评论?原因是我们使用SVN进行版本控制,并且每次重新生成类时,每个单独的文件都显示为已在SVN中进行了更改,即使唯一的区别是此注释。因此,如果可能的话,我想完全删除该评论。 有一个指令,但是我不想删除整个标头,以使子孙后代知道它是从工

  • 很抱歉,如果这个问题不适合StackOverflow,它不是一个编码问题。 我是Maven的新手,我很好奇为什么会有一个Maven中央存储库看起来可以免费访问。据我所知,它是由一家名为SonaType的公司维护的。他们在资助吗?为什么?它是否在其剩余业务中充当潜在客户开发工具?我想如果我了解他们的理由,我就会知道是否或如何/何时信任他们。

  • 我添加到我的实体中 @version@temporal(temporaltype.timestamp) @column(name=“version”) 专用日期版本; 错误: 原因:org.hibernate.exception.ConstraintViolationException:无法执行语句(...) org.hibernate.exception.internal.standardsql

  • 一个程序应该永远不要假设用户环境是健全的。这包括(但是决不限于此): 用户输入,信号,环境变量,资源,IPC,mmap(内存映射),工作目录的文件系统, 文件描述符,打开文件的数量,等等 你永远不要假设你可以捕捉到所有的用户可能产生的非法输入样式。 换言之,你的程序应该过滤只准许一些你认为安全的特别的输入子集。 不正确的确认数据会导致各种错误,特别是在互联网上的CGI脚本。 对于文件名你应该额外小

  • 签名 m.version 参数 类型 是否必须 描述 返回 String 返回版本号 工作原理 m.version 属性会返回当前 Mithril 的版本号。 版本号使用 semver 规范,格式为 “0.0.0”,第一个数字是主板本号,第二个数字是次版本好,第三个数字是修订版本号。 当有向下不兼容的 API 更改时,更新主版本号 当添加新功能,且向下兼容时,更新次版本号 当修复 bug,且向下兼