标准的Sun javac可以进行增量编译吗?

时间:2010-04-07 07:07:05

标签: java eclipse compiler-construction sun incremental-compiler

最近我开始使用Eclipse的java编译器,因为它比标准的javac快得多。我被告知它更快,因为它执行增量编译。但我仍然有点不确定,因为我找不到任何关于eclispse和sun的编辑器“增量功能”的权威文档。是不是Sun的编译器总是编译每个源文件而Eclipse的编译器只编译已更改的文件和那些受此类更改影响的文件?

编辑:我没有使用Eclipse autobuild功能,而是我正在设置

-Dbuild.compiler=org.eclipse.jdt.core.JDTCompilerAdapter

我的蚂蚁构建。

4 个答案:

答案 0 :(得分:15)

  

Sun的编译器是否总是编译每个源文件,Eclipse的编译器只编译已更改的文件和受此类更改影响的文件?

我相信你在两方面都是正确的。

您当然可以强制Eclipse重新编译所有内容。

但方程式的另一部分是像Ant和Maven这样的Java构建工具只能编译已更改的类及其依赖类树。

编辑

在Ant中,渐进式编译可以通过两种方式完成:

  • 默认情况下,<javac> task会比较.java和相应.class文件的时间戳,并且只告诉Java编译器重新编译比新文件更新的源文件(.java)它们对应的目标(.class)文件,或者根本没有目标文件。

  • <depend> task还考虑了类之间的依赖关系,它通过读取和分析嵌入在.class文件中的依赖关系信息来确定。确定哪些.class文件已过期后,<depend>任务会删除它们,以便后续<javac>任务将重新编译它们。但是,这并非完全是万无一失的。例如,对源代码的大量更改可能导致<depend>任务可能正在分析过时的依赖关系。某些类型的依赖(例如静态常量)在.class文件格式中也不明显。

    要了解Ant <depend>不是万无一失的原因,请阅读documentation的“限制”部分。

答案 1 :(得分:3)

Javac只编译在命令行上命名的源文件,或者是依赖项并且已过期。 Eclipse可能有更精细的方式来决定这意味着什么。

答案 2 :(得分:2)

Eclipse肯定会这样做。如果您打开了该选项(默认情况下也是如此),它也会在节省时间执行此操作。看起来sun也没有这样做(它很容易测试,只做一个小项目,其中A是使用B类的主类,但是B不使用A类。然后改变A并编译项目再次,查看b.class的时间戳是否已更改。

这是许多编译器工作的方式(例如gcc)。您可以使用ant和make之类的工具来仅编译已更改项目的部分。另请注意,这些工具并不完美,有时eclipse会失去对更改的跟踪,您需要进行完全重建。

答案 3 :(得分:2)

重申我在这里所听到的内容并为像我这样的懒惰人士写下来:

您可以使用ant中的javac任务实现增量构建,但是您应该使用depend任务清除修改后的.java的.class文件,并且不得在javac任务中未指定includes语句。 (在javac任务中仅指定src路径并且离开包括未指定的原因导致javac重新编译它找到的所有源。)

这是我的依赖和javac任务。使用标准的Oracle java编译器,只编译我修改的.java文件。希望这有帮助!

<depend srcdir="JavaSource" destdir="${target.classes}" cache="${dependencies.dir}" closure="yes">
    <classpath refid="compiler.classpath" />
    <include name="**/*.java"/>
</depend>

<javac destdir="${target.classes}" debug="true" debuglevel="${debug.features}" optimize="${optimize.flag}" fork="yes" deprecation="no" source="1.6" target="1.6" encoding="UTF-8" includeantruntime="no">
    <classpath refid="compiler.classpath"/>
    <src path="JavaSource"/>
    <include name="**/*.java" />   <!-- This enables the incremental build -->
</javac>