如何加快Gradle依赖性解析或通常提高性能?

时间:2016-02-03 16:42:27

标签: groovy gradle configuration parallel-processing

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

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

如何在配置阶段设置我的依赖关系列表,只执行一次并确定范围,以便所有项目都可以使用这些信息?有一个插件的例子吗?当然,它必须与并行性一起工作。

我是否需要使用可提高性能的Spring依赖管理插件?

现在,构建时间大约是25分钟(离线运行),我在一个中等体面的8核盒子上。这是守护进程运行而没有单元或集成测试。 : - /

1 个答案:

答案 0 :(得分:1)

如果不了解更多有关您的环境或设置的信息,很难说。但是一些一般规则:

  1. 您确定依赖解决方案是问题所在,请使用--profile获取更多信息。 (see docs

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

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

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

  5. 尝试将以下内容添加到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)"
        }
    })