将 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 文件相同。
我把一个项目的编译从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 文件相同。