gpt4 book ai didi

java - 同一个 javac 编译器是否可以编译同一组源文件但产生不同校验和的类文件?

转载 作者:行者123 更新时间:2023-11-30 09:44:41 25 4
gpt4 key购买 nike

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

                       <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>

...反对这个:(在 maven 中)

        <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>

...只是发现 2 个生成的类文件的校验和略有不同,而其余的是相同的。我认为多线程发挥了作用,但为任一选项生成的校验和在反复尝试后似乎是一致的。什么可能导致这个结果?

更新:

我使用 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 - 同一个 javac 编译器是否可以编译同一组源文件但产生不同校验和的类文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7769319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com