当前位置: 首页 > 面试题库 >

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

穆彬郁
2023-03-14
问题内容

我正在尝试比较以下结果:(在蚂蚁中)

                       <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。这是相关的摘录: 此问题是由以下事实引起