编译Groovy和Kotlin?

Eri*_*agt 20 groovy gradle kotlin

我正在使用Groovy和Kotlin开发一个小项目,而我的Kotlin代码依赖于我的Groovy代码,而不是相反.但是,Kotlin首先编译我的代码而不是Groovy,因此,我得到的错误就像Unresolved reference: SiteRepository

任何建议我如何解决这个问题,通过改变构建顺序,或者Kotlin明确依赖于Groovy,还是任何其他建议?

jks*_*der 26

可以这样做:

4.10之后

Kotlin第一:

//compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy
Run Code Online (Sandbox Code Playgroud)

在4.10之前

Groovy第一:

compileGroovy.dependsOn = compileGroovy.taskDependencies.values - 'compileJava'
compileKotlin.dependsOn compileGroovy
compileKotlin.classpath += files(compileGroovy.destinationDir)
classes.dependsOn compileKotlin
Run Code Online (Sandbox Code Playgroud)

或者Kotlin第一:

compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'
compileGroovy.dependsOn compileKotlin
compileGroovy.classpath += files(compileKotlin.destinationDir)
classes.dependsOn compileGroovy
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,你可以选择你的Kotlin代码是否依赖于Kotlin上的Groovy或Groovy,但是你不能同时使用它.

  • 是的,对于从不版本的Gradle),`taskDependencies`不起作用.从Gradle 3.1升级到4.10.2时,删除此行修复它:`compileKotlin.dependsOn = compileKotlin.taskDependencies.values - 'compileJava'.此外,似乎不再需要`classes.dependsOn compileGroovy`. (2认同)

Rus*_*lan 7

我认为在一个模块中针对Groovy编译Kotlin是不可能的,但是你可以将Groovy(或Kotlin)移到单独的模块中.Groovy将在jar中编译,而Kotlin现在可以依赖于Groovy代码.为了帮助你,我编写了简单的项目,并将其发布在github上.

upd 1:

我使用kotlin和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
Run Code Online (Sandbox Code Playgroud)

看起来像改变kotlin和groovy任务的顺序就足够了.但是,如果我们以这种方式改变步骤:

./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
Run Code Online (Sandbox Code Playgroud)

Build仍然不起作用,因为Kotlin没有看到Groovy.

  • 在`gradle.build`中,我写道:`compileKotlin.dependsOn(compileGroovy)`,然后我从compileGroovy中删除了compileJava`,因为首先将更改引入了循环依赖关系:`compileGroovy.dependsOn.remove('compileJava')`。 (2认同)