运行32位Java和64位Java会产生不同的结果。

4

我正在运行JAXB XJC代码生成器(v2.2.4-1),在32位linux和32位java上正常工作。但是当我在64位linux上运行它时,会出现以下错误:

Exception in thread "main" java.lang.IllegalArgumentException:
    Illegal class inheritance loop.
    Outer class ProductSectionProperty may not subclass from inner class: ProductSectionProperty

在这两种情况下,我都使用的是Oracle的JDK 1.6.0_u24。

为了解决这个问题,我尝试了以下措施:

  • 在64位机器上使用32位java
  • 指定-XX:+UseCompressedOops
  • 当我意识到以上选项是默认设置时,指定-XX:-UseCompressedOops

但结果仍然相同。

有任何想法为什么会出现这种情况以及接下来该尝试什么吗?


3
我建议尝试Java 6更新版26,因为这听起来像是一个bug。要么两个都应该能用,要么两个都应该不能用。你也可以尝试Java 7,看看是否会出现同样的情况(即使你���打算使用它)。 - Peter Lawrey
看起来是需要与 Oracle 进行支持电话沟通了,Java 明显不够可移植。你可以尝试使用其他的 JVM,IBM 或 JRockit 将是主要选择。 - Steve-o
Steve-o谢谢!我尝试了IBM的JDK,它在两个系统上都可以工作。 - ivant
可能是重复问题:https://dev59.com/aEXRa4cB1Zd3GeqPq1VA - Denis Tulskiy
@ivant - 你能为这个问题输入一个错误报告吗:http://java.net/jira/browse/JAXB/ - bdoughan
@Blaise - 我认为这不是JAXB的bug,因为它只在64位Linux机器上与Oracle的JDK失败。我正在尝试创建一个简单的场景来重现这个问题,因为我不能将整个项目(太大且专有)发送给Oracle。 - ivant
1个回答

0
有没有什么想法为什么会发生这种情况,或者下一步应该尝试什么?
1)没有
2)我建议你暂时忽略32位与64位的问题,尝试通过其他方式解决这个问题。我在谷歌上搜索了"非法类继承循环"的信息,有很多相关结果。你可以浏览一下,看看其中的症状/根本问题/解决方案是否适用于你的情况。
(我没有找到关于这个问题的Java bug,但根据我的经验,Java bug搜索功能并不好用...)

我也尝试了那条路,但由于生成的类是相当大的项目的一部分,所以我把“修复”模式/绑定作为最后的手段。 - ivant
无论如何,我都很困扰JVM的行为如此不同。我能想到的唯一一件事是,较长的地址可能会产生比从JAXB代码中预期的更大的哈希值。但这看起来不太可能,因为hashCode方法仍然返回“int”。我浏览了JAXB包的源代码,没有发现任何可疑的hashCode/equals方法。 - ivant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接