如何加快 Gradle 依赖项解析或总体上提高性能?
How can I speed up Gradle dependency resolution or generally improve performance?
我正在从 Maven 转换一个非常大的构建。我已将许多 BOM 转换为依赖列表。我也在使用 Spring 依赖管理插件。
问题是依赖性管理需要永远。请注意,即使我使用 --offline
,它似乎也花费了太长时间。我还刚刚读到使用 allprojects {}
和 subprojects{}
会导致并行失败。不过,显然我需要提供类似功能的东西。此迁移的 objective 首先是为了提高性能,但我认为到目前为止并没有什么更好的。我需要知道:
如何在配置阶段设置我的依赖项列表,只设置一次并限定范围,以便所有项目都可以使用该信息?是否有执行此操作的插件示例?当然,它必须以并行方式工作。
我需要使用 Spring 依赖管理插件来提高性能吗?
现在,构建时间大约为 25 分钟(运行 离线),我在一个还算不错的 8 核盒子上。那是守护进程 运行,没有单元或集成测试。 :-/
在不了解您的环境或设置的情况下很难说。但一些一般规则:
您确定问题出在依赖项解析上吗,请使用 --profile 获取更多信息。 (see docs)
确保您只有一个存储库可供查看,最好离您最近且速度快。我们通常在我们的 Nexus 中设置一个代理,这样我们就可以让 Nexus 缓存整个部门。对于每个新存储库,Gradle 也会在那里查找所有版本。
确保您的 Gradle 缓存速度很快(想想本地 SSD 与 NFS 安装的旧磁盘)。否则将您的 $GRADLE_USER_HOME 移动到另一个地方。
添加 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)"
}
})
我正在从 Maven 转换一个非常大的构建。我已将许多 BOM 转换为依赖列表。我也在使用 Spring 依赖管理插件。
问题是依赖性管理需要永远。请注意,即使我使用 --offline
,它似乎也花费了太长时间。我还刚刚读到使用 allprojects {}
和 subprojects{}
会导致并行失败。不过,显然我需要提供类似功能的东西。此迁移的 objective 首先是为了提高性能,但我认为到目前为止并没有什么更好的。我需要知道:
如何在配置阶段设置我的依赖项列表,只设置一次并限定范围,以便所有项目都可以使用该信息?是否有执行此操作的插件示例?当然,它必须以并行方式工作。
我需要使用 Spring 依赖管理插件来提高性能吗?
现在,构建时间大约为 25 分钟(运行 离线),我在一个还算不错的 8 核盒子上。那是守护进程 运行,没有单元或集成测试。 :-/
在不了解您的环境或设置的情况下很难说。但一些一般规则:
您确定问题出在依赖项解析上吗,请使用 --profile 获取更多信息。 (see docs)
确保您只有一个存储库可供查看,最好离您最近且速度快。我们通常在我们的 Nexus 中设置一个代理,这样我们就可以让 Nexus 缓存整个部门。对于每个新存储库,Gradle 也会在那里查找所有版本。
确保您的 Gradle 缓存速度很快(想想本地 SSD 与 NFS 安装的旧磁盘)。否则将您的 $GRADLE_USER_HOME 移动到另一个地方。
添加 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)"
}
})