在TeamCity上使用kotlin编译android项目失败

时间:2017-06-23 13:41:06

标签: android continuous-integration kotlin teamcity travis-ci

我的构建步骤使用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)

关于我为什么会这样做的任何想法?

2 个答案:

答案 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服务器上禁用这两个守护程序。