我正在尝试比较以下结果:(在蚂蚁中)
<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
和的文件,并注意到唯一的区别是:
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文件调用编译器的顺序是不同的,并且编译的顺序会影响结果。
问题内容: 给定相同的主要版本,例如Java 7,不同的Java编译器(例如Oracle的热点,JRockit或IBM的J9等)是否将给定的Java源代码文件编译为相同的bytcode? 扫描Java 7语言规范 ,似乎正在讨论的是语言的语义,而不是代码到字节码的转换。 YES 。 以上摘录为: JLS留下了许多实现细节,因一个实现而异。 和 但是,JLS没有指定从源代码到生成的字节码的1:1映射
相同版本的代码优化是否有任何差异:OracleJava编译器ApacheJava编译器IBMJava编译器OpenJDKJava编译器。如果有什么代码可以展示不同的优化?或者他们使用相同的编译器?如果没有已知的优化差异,那么我在哪里可以找到关于如何测试不同优化的编译器的资源?
我今天正在做一些事情,但是我注意到代码中有一些东西,所以让我解释一下情况。 我从不同的concreateclass的接口中获取数据,看看这个示例代码 我将来自GetSampleData()方法的数据放在接口的数组中(将在下面的代码中看到),我注意到数组中的数据与来自同一类型的变量的数据不同,让我们看看代码 所以对于第一个IENumable unileIENumable=new List();工作正
问题内容: 谁能解释相同的Java源代码最终如何编译成 二进制 不同的类文件? 问题来自以下情况: 我们有一个相当大的应用程序(800多个类),该应用程序已经分支,重组并重新集成到主干中。在重新集成之前,我们将主干合并到分支中,这是标准过程。 最终结果是一组包含分支源的目录和一组包含中继源的目录。使用“超越比较”,我们能够确定两组来源相同。但是,在编译时(使用IntelliJ v11中托管的mav
问题内容: 我应该使用什么编译器(我正在使用gcj 4.x)选项来生成供我的Java应用程序在Windows中运行的“ exe”文件? 问题答案: 要编译Java程序MyJavaProg.java,请输入: 要链接它,请使用以下命令: 然后链接以创建可执行文件mycxxprog.exe
问题内容: 注意:这是从Comparable和Comparator合约衍生出来的,涉及null 该代码可以在Eclipse(20090920-1017)中编译并正常运行 但是它不能在上编译javac 1.6.0_17。这是错误消息: 有人可以解释为什么差异吗?这是一个错误吗?如果是这样,谁有错误? 问题答案: 这是一个已确认的错误:错误ID 6468354。这是相关的摘录: 此问题是由以下事实引起