Gradle – Groovy和Java类依赖 – 编译

我的项目有Java(N文件)和Groovy代码(仅1个文件)。 Java编译依赖于这个用于Java编译的单个Groovy文件的类文件(compileJava任务成功)。

当我不使用src / java作为main> groovy> sourceSet部分中的srcDir之一时,我得到一个错误,说明找不到类/符号,这是在groovy文件/类中。 在ANT中,我们很容易在调用compile-java目标之前首先调用compile-groovy目标,但Gradle中的相同内容正是我想要查找的内容。

我读了一些post,发现如果我将main> java section设为NULL并为main> java指定srcDir,这是src / java里面的main> groovy sourceSet部分,那么它编译得很好。

我的:1。还有其他办法吗? 例如,以下应该有效:

compileJava { dependsOn compileGroovy } 

但是,这是一个infinte循环。

要么

如何使用doFirst进行compileJava任务:

 compileJava { doFirst { compileGroovy } } 

这也不起作用。

build.gradle这样可行 ,但是在某种意义上compileRava在这里变得无用,即使源代码有N否。 src / java或src / java-test等树中的java文件。 我知道这个构建脚本正在运行但从逻辑上讲,如果他/她不熟悉为什么源代码为Groovy必须将“src / java”作为其srcDir值,它可能会给开发人员带来一些困惑。

 apply plugin: 'java' apply plugin: 'groovy' sourceSets { main { groovy { srcDir 'src/groovy' srcDir 'src/java' } java { //The following needs to be commented out OR Gradle will always pick compileJava before compileGroovy //srcDir 'src/java' //srcDir 'src/java-test' } } test { groovy { srcDir 'test/groovy' } java { srcDir 'test/java' } resources { srcDir 'test/resources' srcDir 'conf' } } integrationTest { groovy { srcDir 'src/groovy-test' } java { srcDir 'src/java-test' } resources { srcDir 'test/resources' srcDir 'conf' } } } 

其他链接: 如何在Java测试之前使Gradle编译Groovy测试

Groovy(基础)插件使GroovyCompile任务依赖于相应的JavaCompile任务,因为从Groovy调用Java比通过其他方式更常见。 如果您需要相反的方式(或两种方式),联合编译是一个很好的解决方案。 这是一个有点改进(在您的版本上)联合编译设置:

 sourceSets { main { groovy { // override the default locations, rather than adding additional ones srcDirs = ['src/groovy', 'src/java'] } java { srcDirs = [] // don't compile Java code twice } } } 

如果您更喜欢仅使用Java-> Groovy依赖项进行单独编译,则以下内容应该起作用:

 // since you aren't using the default locations sourceSets { main { groovy { srcDirs = ['src/groovy'] } java { srcDirs = ['src/java'] } } } // remove GroovyCompile->JavaCompile task dependencies tasks.withType(GroovyCompile) { dependsOn = [] } // add JavaCompile->GroovyCompile task dependencies tasks.withType(JavaCompile) { task -> dependsOn task.name.replace("Java", "Groovy") } 

因为JavaCompile任务及其相应的GroovyCompile任务写入同一输出目录,所以Java编译现在将在其编译类路径上具有已编译的Groovy代码。

PS:不支持从其他任务调用任务,如果尝试,可能会发生不好的事情。 相反,您应该始终使用任务关系( dependsOnfinalizedBymustRunAftershouldRunAfter )。