使用 maven 与 ant 编译相同的枚举:差异
Compiled same enum with maven vs. ant: Differences
我用 Maven 和 Ant 编译了相同的枚举 (Java 7)。 class 文件不同。常量池中某些元素的顺序似乎不同,而且生成的方法具有不同的字节码。对于 Maven,"values()" 方法看起来像这样:
public static de.continentale.vs.common.model.enums.PartnerRolle[] values();
Code:
0: getstatic #1 // Field $VALUES:[Lde/continentale/vs/common/model/enums/PartnerRolle;
3: invokevirtual #2 // Method "[Lde/continentale/vs/common/model/enums/PartnerRolle;".clone:()Ljava/lang/Object;
6: checkcast #3 // class "[Lde/continentale/vs/common/model/enums/PartnerRolle;"
9: areturn
另一个版本(Ant)是这样的:
public static de.continentale.vs.common.model.enums.PartnerRolle[] values();
Code:
0: getstatic #115 // Field ENUM$VALUES:[Lde/continentale/vs/common/model/enums/PartnerRolle;
3: dup
4: astore_0
5: iconst_0
6: aload_0
7: arraylength
8: dup
9: istore_1
10: anewarray #1 // class de/continentale/vs/common/model/enums/PartnerRolle
13: dup
14: astore_2
15: iconst_0
16: iload_1
17: invokestatic #147 // Method java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V
20: aload_2
21: areturn
我编译的所有枚举似乎都会发生这种情况。知道发生了什么吗?
尽管 Ant 正确使用了 jdk 1.7.0_67,但结果受到在后台创建 class 文件的 Eclipse 编译器的影响。所以一些 "Ant class files" 确实是 Ant 没有再次构建的 Eclipse class 文件。 Eclipse 编译器生成的字节码略有不同。
我用 Maven 和 Ant 编译了相同的枚举 (Java 7)。 class 文件不同。常量池中某些元素的顺序似乎不同,而且生成的方法具有不同的字节码。对于 Maven,"values()" 方法看起来像这样:
public static de.continentale.vs.common.model.enums.PartnerRolle[] values();
Code:
0: getstatic #1 // Field $VALUES:[Lde/continentale/vs/common/model/enums/PartnerRolle;
3: invokevirtual #2 // Method "[Lde/continentale/vs/common/model/enums/PartnerRolle;".clone:()Ljava/lang/Object;
6: checkcast #3 // class "[Lde/continentale/vs/common/model/enums/PartnerRolle;"
9: areturn
另一个版本(Ant)是这样的:
public static de.continentale.vs.common.model.enums.PartnerRolle[] values();
Code:
0: getstatic #115 // Field ENUM$VALUES:[Lde/continentale/vs/common/model/enums/PartnerRolle;
3: dup
4: astore_0
5: iconst_0
6: aload_0
7: arraylength
8: dup
9: istore_1
10: anewarray #1 // class de/continentale/vs/common/model/enums/PartnerRolle
13: dup
14: astore_2
15: iconst_0
16: iload_1
17: invokestatic #147 // Method java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V
20: aload_2
21: areturn
我编译的所有枚举似乎都会发生这种情况。知道发生了什么吗?
尽管 Ant 正确使用了 jdk 1.7.0_67,但结果受到在后台创建 class 文件的 Eclipse 编译器的影响。所以一些 "Ant class files" 确实是 Ant 没有再次构建的 Eclipse class 文件。 Eclipse 编译器生成的字节码略有不同。