28

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

编辑:我没有使用 Eclipse 自动构建功能,而是在设置

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

对于我的蚂蚁构建。

4

4 回答 4

16

Sun 的编译器总是编译每个源文件,而 Eclipse 的编译器只编译已更改的文件以及受此类更改影响的文件,这是真的吗?

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

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

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

编辑

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

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

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

    要了解为什么 Ant<depend>不是万无一失的,请阅读文档的“限制”部分。

于 2010-04-07T07:34:15.273 回答
4

Javac 仅编译在命令行上命名的源文件或依赖项且已过期的源文件。Eclipse 可能有一种更细粒度的方式来决定这意味着什么。

于 2010-12-04T00:45:05.163 回答
2

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

这是许多编译器的工作方式(例如 gcc)。您可以使用 ant 和 make 等工具仅编译项目已更改的部分。另请注意,这些工具并不完美,有时 eclipse 只是忘记了更改,您需要进行完全重建。

于 2010-04-07T07:30:29.687 回答
2

重述我在这里听到的内容,并为像我这样的懒惰的人解释一下:

您可以使用 ant 中的 javac 任务实现增量构建,但您应该使用依赖任务来清除修改后的 .java 的 .class 文件,并且您不能在 javac 任务中未指定包含语句。(在 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>
于 2013-11-25T14:27:08.480 回答