将 Ant 更改为 Maven 后#-values 中的字节码差异

Byte code difference in #-values after change Ant to Maven

我把一个项目的编译从Ant改成了Maven。我们还是用Java1.7.0_80。除了比较器 class 之外,所有 classes 的字节码都保持不变。我用 javap -c 反汇编了 class。唯一的区别在于#值,例如:

之前:invokevirtual #2

之后:invokevirtual #29

这些#值是什么意思?这是功能上的差异还是命名上的差异?

编辑:字节码中的第一个方法前后:

  public de.continentale.kvrl.model.comp.KvRLRechBetragEuroComparator();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        


  public de.continentale.kvrl.model.comp.KvRLRechBetragEuroComparator();
    Code:
       0: aload_0       
       1: invokespecial #21                 // Method java/lang/Object."<init>":()V
       4: return   

#29 引用常量 table 中的索引,该索引描述了被调用的方法。如果您粘贴 javap -c 完整 输出会更好,因为该行末尾的注释指示实际的方法描述符。

javap -c 在 class 中调用实例方法 test 的示例 Z:

   7: invokevirtual #19                 // Method snippet/Z.test:()V

可以忽略#号,只要注释中的方法描述符相同即可。

为什么

至于"why"的问题,很有可能是ant和maven编译器task/plugin设置中debug引起的。

默认情况下,maven-compiler-plugin 将 debug 配置选项设置为 true 进行编译,这将附加源文件的名称以及行号 tables和局部变量名。

https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html

默认情况下,ant java 编译器将此设置为 false

https://ant.apache.org/manual/Tasks/javac.html

为了比较和检查,将 Ant Javac 任务的 debug 参数设置为 true 并查看是否使生成的 .class 文件相同。