标准Sun javac可以进行增量编译吗?
问题内容:
最近,我开始使用Eclipse的Java编译器,因为它比标准Javac快得多。有人告诉我它更快,因为它执行增量编译。但是我对此还不太确定,因为我找不到有关eclispse和sun的编译器“增量功能”的任何权威文档。Sun的编译器总是编译每个源文件,Eclipse的编译器只编译更改的文件以及受此更改影响的文件,这是真的吗?
编辑:我没有使用Eclipse自动构建功能,而是在设置
-Dbuild.compiler=org.eclipse.jdt.core.JDTCompilerAdapter
为我的蚂蚁建造。
问题答案:
Sun的编译器总是编译每个源文件,而Eclipse的编译器只编译更改的文件以及受此更改影响的文件,这是真的吗?
我相信您在这两个方面都是正确的。
当然,您可以强制Eclipse重新编译所有内容。
但是等式的另一部分是,Java构建工具(例如Ant和Maven)仅能够编译已更改的类及其依赖类树。
编辑
在Ant中,可以通过两种方式完成增量编译:
-
默认情况下,该
<javac>
任务会比较.java
和相应.class
文件的时间戳,只告诉Java编译器重新编译比其相应目标(.class)文件新的源文件(.java),或者根本没有目标文件。 。 -
该
<depend>
任务还考虑了类之间的依赖关系,该任务通过读取和分析嵌入在.class
文件中的依赖关系信息来确定。确定哪些.class
文件已过时后,该<depend>
任务将其删除,因此后续<javac>
任务将重新编译它们。但是,这并非完全傻瓜。例如,对源代码进行大量更改可能导致<depend>
任务正在分析过时的依赖关系。同样,某些类型的依赖关系(例如,对静态常量的依赖)在.class
文件格式中也不明显。
要了解为什么Ant
<depend>
不安全,请阅读文档的“限制”部分。