2017-06-23 63 views
8

我的生成步驟從TeamCity的使用gradle這個建立模板,但不幸的是我得到:編譯與TeamCity的科特林Android項目失敗

[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) 

爲什麼我會得到這個任何想法?

+1

顯示您的build.gradle文件請 – Lovis

+0

哇,這很酷。在評論這個問題後兩天,我遇到了同樣的問題......請參閱我的解答 – Lovis

回答

3

我遇到了同樣的問題。不過,它並沒有與Kotlin連接。

我不得不禁用gradle deamon(它不推薦在CI服務器上)。

在teamcity中,您可以通過將-Dorg.gradle.daemon=false添加到GRADLE_OPTS環境變量中來實現。

https://docs.gradle.org/current/userguide/gradle_daemon.html

+0

這是正確的。另外從Gradle 3.0開始,默認情況下Gradle是守護進程,這意味着KotlinCompileDaemon將繼續存在。 –

+0

鏈接注意:自從Gradle 3.0開始,我們默認啓用守護進程,並推薦將**用於開發人員的機器和持續集成服務器**。但是,如果您懷疑守護進程會使您的CI構建不穩定,則可以將其禁用,以便爲每個構建使用全新的運行時,因爲運行時與以前的任何構建完全隔離。 –

+0

@lovis將環境變量覆蓋gradle.properties值嗎?我們希望在開發環境中啓用守護進程,但在CI服務器上禁用它。 –

1

默認情況下,科特林編譯器執行在自己的進程守護。在CI運行時,通過這個配置搖籃編譯科特林相同的生成過程:

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

禁用搖籃守護也是CI環境中常見的做法:

-Dorg.gradle.daemon=false 

可以預期的是,搖籃守護進程屬性也會禁用Kotlin編譯器runner守護進程,但這不是當前發生的情況。 GradleKotlinCompilerRunner.kt只考慮了org.gradle.daemon財產kotlin.compiler.execution.strategy財產。如果沒有定義的執行策略,亞軍默認使用"daemon"策略:

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"將讓你compileInProcess()不管搖籃守護程序配置的,但是,您可能需要禁用這兩個CI服務器上的守護進程。