gradle - 为什么我的 Kotlin Gradle 构建退出代码为 137?

标签 gradle kotlin

在运行 Kotlin 代码库测试时,我们在 CI 环境中发现了神秘的故障。

gradle test 编译代码和测试就好了。测试运行并且一切似乎都通过了。但随后 Gradle 以代码 137 退出(表明它已被 SIGKILL 终止),CI 系统因此认为构建失败。

限制 Gradle 的 JVM 大小没有帮助。 --no-daemon--max-workers 选项也没有。

这是在 Java 8 JVM 上使用 Kotlin 1.2.40 和 Gradle 4.3。

最佳答案

这个案例的罪魁祸首原来是 Kotlin 编译器。

默认情况下,Kotlin 编译器会在后台生成一个守护进程,以便后续编译作业更快。对于非常大的 Kotlin 代码库,此过程最终可能会占用大量内存。

它的存在导致 Gradle 达到 CI 容器的内存限制,并且 Linux OOM killer正在终止 Gradle 进程。

解决方案:Tell the Kotlin compiler not to spawn the background process.事实证明这是设置环境变量的简单问题:

GRADLE_OPTS=-Dkotlin.compiler.execution.strategy=in-process

有了这个变量,Kotlin 编译在 Gradle JVM 中内联运行,因此当 Gradle 继续运行测试时,它的数据可以被垃圾收集。

也可以将选项传递给 gradle 命令,而不是在环境中设置它。

关于gradle - 为什么我的 Kotlin Gradle 构建退出代码为 137?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50138863/

相关文章:

android - 仅在 Lollipop 设备上崩溃,: VrVideoView$Options 的解析失败

android - Crashlytics NDK 符号和 Gradle 任务

android - 使用 MockK coVerify 时,未调用方法

kotlin - 这个扩展功能为什么/如何工作?如何在没有 `with` 的情况下调用它?

java - gradle 5 - windows java.io.IOException : CreateProcess error=206, 文件名太长

jetty - Gradle Jetty 插件锁定文件

android - 获取 MultiDex 错误,即使在设置 Min SDK 21 之后

java - 在包含 NULL 的 ArrayList 上使用 map {} 时出现 NPE

android - RxJava测试 `repeat`在可观察的情况下在测试上创建无穷循环

java - 如何在 Java 中使用 Kotlin Android 扩展