为什么 gradlew build 命令不能只编译和构建已更改的内容并使过程更快?

Why can't gradlew build command compile and build only the things that have changed and make the process faster?

eclipse下自动构建的feature比./gradlew build.

快很多

经过一些研究我发现它只编译和构建更改的文件并在构建文件夹中替换它。

那么为什么./gradlew build命令不能编译和构建已更改的文件并替换它在构建文件夹中并使整个构建过程更快。

我最近开始使用热交换代理 + DCEVM 的自动构建功能。

Why can't gradlew build command compile and build only the things that have changed and make the process faster?

没有可靠的方法来确定需要重新编译的内容。例如,编译时常量被内联并且在 class 文件中没有它们来自哪里的踪迹(它可以在源文件中找到,这意味着解析它们并浪费时间;它可以存储在一些辅助文件和一些工具来做)。

有关详细信息,请参阅 this 的 "Limitations" 部分。

The reason maybe is that they don't go through configure step of gradle.

当然可以,但是配置步骤通常不需要那么长时间。

Eclipse knows which files have changed

好点(在 holwgler 的评论中)。


前段时间我花了一些时间试图使我的 gradle 编译更快,但我放弃了。 Eclipse 非常快,原因有很多:

  • 增量编译
  • 使用所有内核的多线程
  • 了解所有更改的文件
  • 通过 JIT 优化整个编译器代码
  • 可能缓存文件依赖项
  • 丑陋的高度优化代码

我的"solution"忽略了这个问题。我在 Eclipse 中做所有事情,除了集成测试(这比编译花费的时间更长)和生产构建(这很少见,所以我不在乎)。

您可能想阅读这些 performance tips


要找出时间花在哪里,请使用

./gradlew clean; ./gradlew --profile jar

对我来说,90% 的时间只是 :compileJava