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

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

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

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

对于我的蚂蚁构建。


答案 1

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

我相信你在这两点上都是正确的。

你当然可以强迫 Eclipse 重新编译所有内容。

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

编辑

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

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

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

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


答案 2

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


推荐