JAXB向后兼容

时间:2014-09-23 05:40:56

标签: java jaxb jaxb2

多年前,我编写了一个使用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。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

请参阅以下文件: