是否有可能同一个javac编译器编译同一组源文件但生成不同校验和的类文件?

我试图比较这个结果:(在ant中)

        

……对此:(在maven)

   maven-compiler-plugin 2.3.2   compile compile  compile   1.5 1.5 true lines,vars,source true true true  ...      

…只发现2个生成的类文件的校验和略有不同,其余的相同。 我认为multithreading已经发挥了作用,但是对于任一选项产生的校验和似乎在重复尝试时是一致的。 有什么可能解释这个结果?

更新:

我使用javap -verbose检查了一组具有不同校验和的文件,并注意到唯一的区别是:

 const #16 = class #108; // java/lang/Exception const #17 = Method #102.#109; // java/io/Writer.close:()V const #18 = Method #7.#109; // java/io/FileWriter.close:()V 

而不是:

 const #16 = Method #102.#108; // java/io/Writer.close:()V const #17 = Method #7.#108; // java/io/FileWriter.close:()V const #18 = class #109; // java/lang/Exception 

正如您所展示的那样,区别在于生成的常量池,这实际上是一个非问题,但令人不安的是您希望相同的输出具有相同的编译器和选项。 我敢打赌,在两种情况之间,不同顺序的java文件调用编译器,编译顺序会影响结果。

我正在使用javac编译器,我发现它产生不同的结果二进制.class文件,具体取决于作为参数传递的源文件的顺序。 在maven和ant之间我发现了差异。 文件的顺序不一样。

无论如何,在两个编辑之间存在差异。 我已经反汇编了代码,我发现javac(优化器?)正在从其中一个编译中删除已弃用的java jsr / ret汇编指令。

我不知道这种行为是否是“隐式”编译的结果: http : //docs.oracle.com/javase/1.5.0/docs/tooldocs/solaris/javac.html#searching