Gradle - Groovy和Java类依赖 - 编译

Aru*_*gal 13 java groovy compilation class gradle

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

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

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

我的:1.还有其他办法吗?对于前者,以下应该工作:

   compileJava {
     dependsOn compileGroovy
   }
Run Code Online (Sandbox Code Playgroud)

但是,这是一个infinte循环.

要么

如何使用doFirst进行compileJava任务:

compileJava {
      doFirst {
            compileGroovy
      }
}
Run Code Online (Sandbox Code Playgroud)

这也行不通.






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'
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*ser 32

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

如果您更喜欢仅使用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")
}
Run Code Online (Sandbox Code Playgroud)

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

PS:不支持从另一个任务调用任务,如果你尝试,可能会发生不好的事情.相反,你应该总是与工作关系的工作(dependsOn,finalizedBy,mustRunAfter,shouldRunAfter).

  • 不幸的是,在较新的 gradle 版本中,仅更改依赖项不再起作用,因为现在 Java 和 Groovy 编译器有单独的输出目录。Groovy 编译器仍然首先运行,但随后 Java 编译器不会选择已编译的 Groovy 类。(我想避免联合编译,因为生成的字节码对于 Java 类略有不同,我希望它尽可能接近旧的 maven 版本的构建。) (2认同)