2016-03-25 104 views
11

我正在使用Groovy和Kotlin開發一個小型項目,而我的Kotlin代碼取決於我的Groovy代碼,而不是其他方式。然而,科特林編譯我的代碼首先代替了Groovy的,並且,作爲一個結果,我得到這樣Unresolved reference: SiteRepository編譯Groovy和Kotlin?

任何建議,我怎麼能解決這個問題,通過更改構建順序,或科特林Groovy的顯式依賴,或任何錯誤其他建議?

回答

6

我認爲這不可能在一個模塊中針對Groovy編譯Kotlin,但您可以將Groovy(或Kotlin)移動到單獨的模塊中。 Groovy將用jar編譯,而Kotlin現在可以依賴於Groovy代碼。爲了幫助我編寫簡單的項目,並在github上編寫了publish it

UPD 1:

創建新的模塊和項目,科特林和Groovy和檢查任務的依賴關係:

./gradlew -m kotlin-groovy:build 
:kotlin-groovy:compileKotlin SKIPPED 
:kotlin-groovy:compileJava SKIPPED 
:kotlin-groovy:compileGroovy SKIPPED 
:kotlin-groovy:processResources SKIPPED 
:kotlin-groovy:classes SKIPPED 
:kotlin-groovy:jar SKIPPED 
:kotlin-groovy:assemble SKIPPED 
:kotlin-groovy:compileTestKotlin SKIPPED 
:kotlin-groovy:compileTestJava SKIPPED 
:kotlin-groovy:compileTestGroovy SKIPPED 
:kotlin-groovy:processTestResources SKIPPED 
:kotlin-groovy:testClasses SKIPPED 
:kotlin-groovy:test SKIPPED 
:kotlin-groovy:check SKIPPED 
:kotlin-groovy:build SKIPPED 

BUILD SUCCESSFUL 

Total time: 2.587 secs 

貌似科特林和常規任務足夠的變化順序。但是,如果我們改變步驟是這樣的:

./gradlew -m kotlin-groovy:build 
:kotlin-groovy:compileGroovy SKIPPED 
:kotlin-groovy:compileKotlin SKIPPED 
:kotlin-groovy:compileJava SKIPPED 
:kotlin-groovy:processResources SKIPPED 
:kotlin-groovy:classes SKIPPED 
:kotlin-groovy:jar SKIPPED 
:kotlin-groovy:assemble SKIPPED 
:kotlin-groovy:compileTestKotlin SKIPPED 
:kotlin-groovy:compileTestJava SKIPPED 
:kotlin-groovy:compileTestGroovy SKIPPED 
:kotlin-groovy:processTestResources SKIPPED 
:kotlin-groovy:testClasses SKIPPED 
:kotlin-groovy:test SKIPPED 
:kotlin-groovy:check SKIPPED 
:kotlin-groovy:build SKIPPED 

BUILD SUCCESSFUL 

Total time: 2.745 secs 

構建仍然不能正常工作,因爲科特林不會看到Groovy的。

+0

感謝您的回答,但根據此:https://discuss.gradle.org/t/kotlin-groovy-and-java-compilation/14903/2,它似乎是可能的。只是不知道如何。 –

+0

爲什麼你不能引入額外的模塊? – IRus

+1

Kotlin是任何java/groovy項目中的主要語言,因爲它的安全性和語言特性。因此添加一個額外的模塊(這非常簡單)看起來不太難。 – IRus

10

這是可以做到像這樣:

Groovy的第一:

compileGroovy.dependsOn = compileGroovy.taskDependencies.values - 'compileJava' 
compileKotlin.dependsOn compileGroovy 
compileKotlin.classpath += files(compileGroovy.destinationDir) 
classes.dependsOn compileKotlin 

科特林第一:

compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava' 
compileGroovy.dependsOn compileKotlin 
compileGroovy.classpath += files(compileKotlin.destinationDir) 
classes.dependsOn compileGroovy 

需要明確的是,你可以選擇是否你Kotlin代碼依賴於Kotlin上的Groovy或Groovy,但是你不能一直使用它。

+0

感謝您的支持! –

+0

這應該是被接受的答案。 – npskirk

+1

這似乎是主要來源的工作。但是,當我嘗試在Groovy測試代碼中引用Kotlin文件時,此解決方法對我無效。我也嘗試將'compile [Language]'改爲'compileTest [Language'和'classes'到'testClasses'。但它也沒有幫助。 – Niklas