2016-12-09 28 views
4

我使用Maven和Ant(Java 7)编译了相同的枚举。类文件不同。常量池中某些元素的顺序似乎不同,而且生成的方法具有不同的字节码。在“值()”方法看起来像这样对Maven:与maven和ant编译相同的枚举:差异

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  

另一个版本(蚂蚁)是这样的:

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 

这似乎发生了,我编译所有枚举。任何想法发生了什么?

+1

您是否指定了不同的目标JVM版本?您是否使用不同的编译器/ JDK进行编译? – Thilo

+1

他们是否都使用完全相同的Java版本进行编译? – JonK

+0

我使用jdk 1.7.0_67进行了两种编译。目标版本是Java 1.7 –

回答

2

尽管Ant正确使用了jdk 1.7.0_67,但结果受到Eclipse编译器的影响,后者在后台创建类文件。所以一些“Ant类文件”实际上是Ant没有再构建的Eclipse类文件。 Eclipse编译器产生稍微不同的字节码。

+0

可以请你分享*的细节受Eclipse编译器*影响。怎么样?此外,这个问题从来没有读过编译器的任何细节,如何将它链接成为解决问题的方案? – nullpointer

+0

对不起,我在12月9日的注释中添加了编译器版本。在启动“自动构建”的情况下从Eclipse启动Ant目标以某种方式导致某些类与Eclipse编译器一起编译的情况。在从命令行启动Ant任务之前删除目标目录解决了问题。 –