我正在尝试比较以下结果:(在蚂蚁中)
<javac target="1.5" source="1.5" deprecation="on" fork="yes" optimize="true" debug="true" debuglevel="lines,vars,source"> <classpath> <fileset dir="${project.basedir}/../lib"> <include name="**/*.jar" /> <include name="**/*.zip" /> </fileset> </classpath> </javac>
……对此:(在行家中)
<plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <target>1.5</target> <source>1.5</source> <debug>true</debug> <debuglevel>lines,vars,source</debuglevel> <showDeprecation>true</showDeprecation> <optimize>true</optimize> <fork>true</fork> <includes> ... </includes> </configuration> </execution> </executions> </plugin>
…只是发现生成的两个类文件的校验和略有不同,而其余的相同。我认为多线程起了一定的作用,但是在反复尝试后,为这两个选项生成的校验和似乎是一致的。什么可能解释这个结果?
更新:
我使用来检查了一组具有不同校验javap -verbose和的文件,并注意到唯一的区别是:
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文件调用编译器的顺序是不同的,并且编译的顺序会影响结果。