Java 为什么在eclipse中编译相同的代码,然后通过ant使用eclipse编译器时,类文件的大小不同?

Java 为什么在eclipse中编译相同的代码,然后通过ant使用eclipse编译器时,类文件的大小不同?,java,eclipse,Java,Eclipse,我正在使用ant创建一个自动构建环境,以使用eclipse中使用的相同eclipse编译器构建一个新签出的源代码树。问题在于,生成的某些类文件的大小与在eclipse中编译生成的类文件的大小不同。为什么会这样?这样可以吗?这是意料之中的事吗?按照规定,我告诉Ant使用eclipse编译器,如: <target description="compile project with Eclipse compiler" name="build-eclipse-compiler">

我正在使用ant创建一个自动构建环境,以使用eclipse中使用的相同eclipse编译器构建一个新签出的源代码树。问题在于,生成的某些类文件的大小与在eclipse中编译生成的类文件的大小不同。为什么会这样?这样可以吗?这是意料之中的事吗?按照规定,我告诉Ant使用eclipse编译器,如:

<target description="compile project with Eclipse compiler" name="build-eclipse-compiler">
        <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
        <antcall target="build"/>
</target>

Eclipse使用自己的编译器,它生成稍微不同但正确的字节码

Ant使用JDK中提供的标准Sun编译器javac

eclipse编译器可以从eclipse.org下载,并告诉ant使用它。这还有一个额外的好处,即可以单独使用JRE进行编译,这比完整的JDK更容易安装。在中查找“JDT核心批处理编译器”


编辑:即使使用相同的编译器,生成的字节码也可能不同。影响这一点的一些因素包括:

  • 目标JVM-Java6字节码与Java1.2字节码略有不同
  • 优化级别(一些内联,现在最好留给JVM)
  • 调试信息包含

“使用与eclipse中使用的相同的eclipse编译器”(虽然我猜编译器标志不一样),ecj的命令行界面故意模仿javac的命令行界面。很好的解释,尽管我总是会拉下完整的JDK,但不是更难,只是需要更长的时间。@Aaron F:像eclipse这样的应用程序(使用JDT)需要有一套非常好的静态分析工具来支持通过语法突出显示、错误突出显示、建议、自动完成等提供的反馈。Javac不通过API提供这种支持,所以他们自己制作了一套。在这一点上,创建一个编译器只需要很少的额外工作,并且还具有不需要单独安装JDK的额外好处。@darrick,可以是不同的选项和Java版本目标。