【问题标题】:how to fix a slow gradle clean build如何修复缓慢的 gradle clean build
【发布时间】:2020-06-10 00:01:21
【问题描述】:

为这个问题的非常开放的性质道歉,但我有一个 java/spring-boot/gradle 项目,每当我运行 ./gradlew clean build 时,构建总是需要很长时间(大约 10 分钟,而其他团队成员在他们的笔记本电脑上构建相同的项目) - 我不知道为什么会这样,所以任何人都知道从哪里开始/我需要提取/分析什么信息来找到这个问题的原因(很高兴发布任何请求的信息作为对问题的编辑)。

【问题讨论】:

  • 不要只清理构建,使用(远程)构建缓存,使用并行构建并确保您拥有可比较的硬件(cpu、内存等)。
  • 我同意上述评论作为加速构建的工具。要找出花费这么长时间的原因,请发送build scan 并检查是否有任何任务花费的时间比预期的要长(例如编译、单元测试或汇编)。如果您使用的是 Windows,也可能是 Defender 让一切都慢了下来。
  • 检查其他人在构建 gradle 时是否排除了执行测试用例 (-xtest)

标签: java spring spring-boot gradle


【解决方案1】:

首先,在您的 gradle-wrapper.properties 中,添加以下内容:

org.gradle.caching=true
org.gradle.parallel=true

看看有没有帮助。 应该。

第二,您可能想要实现TaskExecutionListener 并将其注册到gradle.taskGraph.addTaskExecutionListeneradvice 来自Peter Niederwieser 本人。

简而言之,在您的顶级 gradle.build 中,复制以下内容:

import java.util.concurrent.TimeUnit

class TimingsListener implements TaskExecutionListener, BuildListener {
    private long startTime
    private timings = []

    @Override
    void beforeExecute(Task task) {
        startTime = System.nanoTime()
    }

    @Override
    void afterExecute(Task task, TaskState taskState) {
        def ms = TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);
        timings.add([ms, task.path])
        task.project.logger.warn "${task.path} took ${ms}ms"
    }

    @Override
    void buildFinished(BuildResult result) {
        println "Task timings:"
        for (timing in timings) {
            if (timing[0] >= 50) {
                printf "%7sms  %s\n", timing
            }
        }
    }

    @Override
    void buildStarted(Gradle gradle) {}

    @Override
    void projectsEvaluated(Gradle gradle) {}

    @Override
    void projectsLoaded(Gradle gradle) {}

    @Override
    void settingsEvaluated(Settings settings) {}
}

gradle.addListener new TimingsListener()

输出可能如下所示:

gradlew build

> Task :compileJava UP-TO-DATE
:compileJava took 3255ms

> Task :processResources UP-TO-DATE
:processResources took 10ms

> Task :classes UP-TO-DATE
:classes took 0ms

> Task :bootWar UP-TO-DATE
:bootWar took 637ms

> Task :war SKIPPED
:war took 0ms

> Task :assemble UP-TO-DATE
:assemble took 0ms

> Task :compileTestJava UP-TO-DATE
:compileTestJava took 427ms

> Task :processTestResources UP-TO-DATE
:processTestResources took 5ms

> Task :testClasses UP-TO-DATE
:testClasses took 0ms

> Task :test UP-TO-DATE
:test took 62ms

> Task :check UP-TO-DATE
:check took 0ms

> Task :build UP-TO-DATE
:build took 0ms
Task timings:
   3255ms  :compileJava
    637ms  :bootWar
    427ms  :compileTestJava
     62ms  :test

奖金

您还可以通过在 build.gradle 中添加 this 来加快测试速度:

test {
    maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 
}

请注意,如果您确实并行运行测试,则必须确保它们是独立的,即不共享资源,无论是文件、数据库还是其他东西。否则,测试可能会以随机且不可预测的方式相互干扰。

【讨论】:

  • 很棒的小贴士!
猜你喜欢
  • 2019-04-25
  • 2015-05-15
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多