【发布时间】:2013-10-01 16:09:19
【问题描述】:
我们在 Linux 和 Windows 上使用相同的 1.6.0_25 版本进行 Java 编译。
由于某种原因,生成的类文件不同。对吗?
【问题讨论】:
-
由于多种原因,文件在字节级别上可能有所不同。然而就 JVM 而言它们是相同的,即你可以运行任何类文件,无论你在哪里编译它,只要编译的 JDK 是兼容的版本。
-
类文件格式、字节码和语言的语义都被正式指定。虽然您可能会看到一些差异,但如果它们产生不同的行为,那就是编译器错误。
-
这就是问题 - 关于字节比较。这与在不同平台上运行无关。
-
字节比较并不能真正告诉你任何事情。例如,将类中的方法写入类文件的顺序无关紧要。因此,如果您有一个类
Foo()和方法bar()和baz(),一个编译器运行将首先按该顺序写出这些方法的字节码,另一个编译器将以相反的顺序执行它。例如,如果编译器将有关这些方法的信息存储在哈希映射中,则可能会发生这种情况。 (hashCode()不保证在程序调用之间为相同的值返回相同的结果,实际上如果不这样做会更好。) -
我们的目标是确定生产war文件和最新版本的对应关系,所以我们使用Beyond Compare的字节比较
标签: java linux windows compilation