如何修复缓慢的 gradle clean 构建

kai*_*ido 4 java spring gradle spring-boot

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

jum*_*key 5

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

\n
org.gradle.caching=true\norg.gradle.parallel=true\n
Run Code Online (Sandbox Code Playgroud)\n

看看是否有帮助。它应该。

\n

其次,您可能想要实现一个TaskExecutionListener并将其注册到gradle.taskGraph.addTaskExecutionListener. 这个建议来自Peter Niederwieser他自己。

\n

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

\n
import java.util.concurrent.TimeUnit\n\nclass TimingsListener implements TaskExecutionListener, BuildListener {\n    private long startTime\n    private timings = []\n\n    @Override\n    void beforeExecute(Task task) {\n        startTime = System.nanoTime()\n    }\n\n    @Override\n    void afterExecute(Task task, TaskState taskState) {\n        def ms = TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);\n        timings.add([ms, task.path])\n        task.project.logger.warn "${task.path} took ${ms}ms"\n    }\n\n    @Override\n    void buildFinished(BuildResult result) {\n        println "Task timings:"\n        for (timing in timings) {\n            if (timing[0] >= 50) {\n                printf "%7sms  %s\\n", timing\n            }\n        }\n    }\n\n    @Override\n    void buildStarted(Gradle gradle) {}\n\n    @Override\n    void projectsEvaluated(Gradle gradle) {}\n\n    @Override\n    void projectsLoaded(Gradle gradle) {}\n\n    @Override\n    void settingsEvaluated(Settings settings) {}\n}\n\ngradle.addListener new TimingsListener()\n
Run Code Online (Sandbox Code Playgroud)\n

输出可能如下所示:

\n
gradlew build\n\n> Task :compileJava UP-TO-DATE\n:compileJava took 3255ms\n\n> Task :processResources UP-TO-DATE\n:processResources took 10ms\n\n> Task :classes UP-TO-DATE\n:classes took 0ms\n\n> Task :bootWar UP-TO-DATE\n:bootWar took 637ms\n\n> Task :war SKIPPED\n:war took 0ms\n\n> Task :assemble UP-TO-DATE\n:assemble took 0ms\n\n> Task :compileTestJava UP-TO-DATE\n:compileTestJava took 427ms\n\n> Task :processTestResources UP-TO-DATE\n:processTestResources took 5ms\n\n> Task :testClasses UP-TO-DATE\n:testClasses took 0ms\n\n> Task :test UP-TO-DATE\n:test took 62ms\n\n> Task :check UP-TO-DATE\n:check took 0ms\n\n> Task :build UP-TO-DATE\n:build took 0ms\nTask timings:\n   3255ms  :compileJava\n    637ms  :bootWar\n    427ms  :compileTestJava\n     62ms  :test\n
Run Code Online (Sandbox Code Playgroud)\n

奖金

\n

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

\n
test {\n    maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 \n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n