【问题标题】:JAXB backward compatibilityJAXB 向后兼容性
【发布时间】:2014-09-23 05:40:55
【问题描述】:

几年前,我编写了一个使用 JAXB 为 XML 模式生成 Java 绑定的应用程序。多年来,应用程序代码和模式已经更新了很多,但自 2008 年以来,JAXB jar 保持不变,那时我开始在这个应用程序中使用 JAXB。我一直在使用 Ant 构建应用程序,包括生成和编译绑定,并且在至少两台 XP Pro 开发机器上一切正常。我对架构进行了一些更改,并且从未考虑过 JAXB。

最近我尝试在一台新笔记本电脑上从头开始重新构建应用程序,但构建一直失败。新的 64 位笔记本电脑运行的是 windows 7 Pro,它有一个更新的 JDK (1.7.0_45) 和一个新版本的 Ant (1.9.3)。通过切换到更新版本的 ant (1.9.4) 并切换到最新的 JAXB jar,我能够解决一些奇怪的问题。在这一点上,我什至不记得这些问题是什么(但我可以通过在 SVN 中恢复到较旧的 JAXB jar 来重新创建它们)。

升级 JAXB 后,我遇到了新问题。首先,ant 中的 xjc 任务似乎对target 属性的解释不同;它引发了一些错误,显然destdir 具有target 过去的语义。

其次,此任务不再生成带有名称应该以 Type 结尾的实现类的 impl 包,因此我的其余代码因一堆编译问题而失败。

有没有办法使新的 JAXB 版本向后兼容?我的其他选择是尝试更新代码以使用新绑定,这似乎是很多不必要的工作,或者恢复到旧的 JDK 和 Ant。

【问题讨论】:

    标签: java jaxb jaxb2


    【解决方案1】:

    这是对原帖的较晚回复。但应该可以作为其他人的参考。我遇到了同样的问题。在尝试使用更高版本的 JDK(8 和 7)重建 JAXB 1.0 方案/绑定之后,这对我有用。

    • 如果可能的话,我的目标是使用最新的 JDK 构建而无需升级 JAXB。
    • JDK 7&8 使用 JAXB 1.0 构建失败,原因是 <xjc> 抛出的 ClassCastException 可能是由于语言功能不兼容。但是,JDK 5&6 可以工作。
    • 我经历了几次尝试升级到最新的 JAXB 2.11.12,
      1. 更新 ant 构建文件 <xjc> 任务以将 target 属性替换为 deskdir
      2. 更改绑定文件语法 - bindingStyle 属性已在最新 JAXB 中的 <jxb:globalBindings> 中删除 - 我们使用 modelGroupBinding
      3. 调整绑定类文件后缀以避免名称冲突。更新生成的新类型名称的来源。
      4. 仍然存在名称冲突和需要源升级。
    • 我决定停止进一步进行所有这些更改,并专注于寻找生成 JDK 7&8 兼容源但仍支持 JAXB 1.0 架构和绑定的 一个 版本的 JAXB。李>
    • 较新的<xjc> 任务通过source 属性支持版本规范。但是,正如原始发布者所发现的那样,在后来的 JAXB 发行版中,对“1.0”的支持被删除了
    • 使用 <xjc> 时出现“Illgal version 1.0”错误消息是由于自 JAXB 2.2.7 (https://jaxb.java.net/nonav/2.2.11/docs/ch02.html#a-2-2-7) 起已删除对 1.0 版的支持
    • 但是,JAXB 2.2.6 也不起作用。 “jaxb-xjc.jar”版本中似乎有一个错误,没有根据 属性正确生成源,导致构建期间出现某些 ClassNotFoundException
    • 我阅读了有关 JAXB 2.1.18 也未能尊重“1.0”源的报告
    • 最终我发现 JAXB 2.0.5 将成为 一个 版本,它可以使用 JAXB 1.0 源模式和绑定生成 JDK 7&8 兼容源。
      • 放入 JAXB-RI 2.0.5 库并删除旧的 jaxb-libs.jar
      • <xjc> 任务添加source="1.0" 属性
      • 此版本无需将<xjc>"target" 属性转换为"deskdir"
      • 我没有测试超过 2.0.5 的更多版本,但可能有更高版本可以做到这一点

    【讨论】:

      【解决方案2】:

      您的旧项目似乎使用 JAXB 1,而现在所有工具都默认使用 JAXB 2.x。

      在 XJC 任务中尝试以下操作:

      • source="1.0"
      • target="1.0"

      查看这些文件:

      【讨论】:

      • 我想我尝试过这样的事情,但没有奏效,所以我认为我做错了什么。当我使用这些值指定这些属性时,我收到错误Illegal version 1.0,或者只是source="1.0"。如果我只指定target="1.0" 我得到1.0 不是有效的版本号也许你的意思是@destdir?。这很令人困惑。
      猜你喜欢
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多