我的构建步骤使用TeamCity中的gradle构建模板,但不幸的是我得到了:
[16:29:22][:presentation:compileLocalDebugKotlin] Using kotlin incremental compilation
[16:29:48][:presentation:compileLocalDebugKotlin] Compilation with Kotlin compile daemon was not successful
[16:29:48][:presentation:compileLocalDebugKotlin] java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
[16:29:48][:presentation:compileLocalDebugKotlin] java.io.EOFException
[16:29:48][:presentation:compileLocalDebugKotlin] at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:229)
[16:29:48][:presentation:compileLocalDebugKotlin] at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162)
关于我为什么会这样做的任何想法?
答案 0 :(得分:3)
我遇到了同样的问题。但是,它与科特林无关。
我必须禁用gradle守护进程(无论如何不建议在CI服务器上使用)。
在teamcity中你可以例如通过将-Dorg.gradle.daemon=false
添加到GRADLE_OPTS
环境变量来实现。
请参阅https://docs.gradle.org/current/userguide/gradle_daemon.html
答案 1 :(得分:2)
默认情况下,Kotlin编译器在其自己的进程守护程序中执行。在CI上运行时,将此配置传递给Gradle,以在同一构建过程中编译Kotlin:
curl -X GET "http://localhost:5984/mychannel/mycc%00key1?attachments=true"
禁用Gradle守护程序也是CI环境中的常见做法:
-Dkotlin.compiler.execution.strategy="in-process"
有人可能会认为Gradle守护程序属性也会禁用Kotlin编译器运行程序守护程序,但这不是当前发生的情况。 GradleKotlinCompilerRunner.kt仅在<{em} -Dorg.gradle.daemon=false
属性之后才考虑org.gradle.daemon
属性。如果未定义执行策略,则跑步者默认使用kotlin.compiler.execution.strategy
策略:
"daemon"
无论Gradle守护程序配置如何,将执行策略明确设置为val executionStrategy = System.getProperty(KOTLIN_COMPILER_EXECUTION_STRATEGY_PROPERTY) ?: DAEMON_EXECUTION_STRATEGY
if (executionStrategy == DAEMON_EXECUTION_STRATEGY) {
val daemonExitCode = compileWithDaemon(compilerClassName, compilerArgs, environment)
if (daemonExitCode != null) {
return daemonExitCode
}
else {
log.warn("Could not connect to kotlin daemon. Using fallback strategy.")
}
}
val isGradleDaemonUsed = System.getProperty("org.gradle.daemon")?.let(String::toBoolean)
return if (executionStrategy == IN_PROCESS_EXECUTION_STRATEGY || isGradleDaemonUsed == false) {
compileInProcess(argsArray, compilerClassName, environment)
}
else {
compileOutOfProcess(argsArray, compilerClassName, environment)
}
都会使您"in-process"
,但是,您可能需要在CI服务器上禁用这两个守护程序。