如何加快 Gradle 依赖项解析或总体上提高性能?

How can I speed up Gradle dependency resolution or generally improve performance?

我正在从 Maven 转换一个非常大的构建。我已将许多 BOM 转换为依赖列表。我也在使用 Spring 依赖管理插件。

问题是依赖性管理需要永远。请注意,即使我使用 --offline,它似乎也花费了太长时间。我还刚刚读到使用 allprojects {}subprojects{} 会导致并行失败。不过,显然我需要提供类似功能的东西。此迁移的 objective 首先是为了提高性能,但我认为到目前为止并没有什么更好的。我需要知道:

如何在配置阶段设置我的依赖项列表,只设置一次并限定范围,以便所有项目都可以使用该信息?是否有执行此操作的插件示例?当然,它必须以并行方式工作。

我需要使用 Spring 依赖管理插件来提高性能吗?

现在,构建时间大约为 25 分钟(运行 离线),我在一个还算不错的 8 核盒子上。那是守护进程 运行,没有单元或集成测试。 :-/

在不了解您的环境或设置的情况下很难说。但一些一般规则:

  1. 您确定问题出在依赖项解析上吗,请使用 --profile 获取更多信息。 (see docs)

  2. 确保您只有一个存储库可供查看,最好离您最近且速度快。我们通常在我们的 Nexus 中设置一个代理,这样我们就可以让 Nexus 缓存整个部门。对于每个新存储库,Gradle 也会在那里查找所有版本。

  3. 确保您的 Gradle 缓存速度很快(想想本地 SSD 与 NFS 安装的旧磁盘)。否则将您的 $GRADLE_USER_HOME 移动到另一个地方。

  4. 添加 DependencyResolutionListener 可能会为您提供有关瓶颈的更多信息。

尝试将以下内容添加到 build.gradle 的开头:

gradle.addListener(new DependencyResolutionListener() {
    ThreadLocal<Long> start = new ThreadLocal<>()
    @Override
    void beforeResolve(ResolvableDependencies dependencies) {
        start.set(System.nanoTime())
    }

    @Override
    void afterResolve(ResolvableDependencies dependencies) {
        long stop  = System.nanoTime() - start.get()
        println "resolving $dependencies.resolutionResult.root.moduleVersion of configuration $dependencies.name (${stop/1000000} ms)"
    }
})