从Gradle执行Groovy脚本而无需编译Java

时间:2018-10-17 07:02:56

标签: java gradle groovy

我有一个使用Gradle的Java项目。 另外,我使用Groovy生成将在Java代码中使用的某些类。 Gradle在下面的单独任务中执行脚本:

task generateClass(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'generatorScript'
}

如果我运行此任务,它将首先启动Java编译,然后再执行脚本。因此,如果编译失败,则将不会执行生成器脚本。如前所述,脚本会生成一个类,而该类实际上是我的Java代码所依赖的,因此,如果不生成,则Java不会被编译。恶性循环。

脚本本身不依赖于某些Java类,并且放置在单独的源目录中:

/src
   /main
      /java
          /...(java classes)
      /groovy
          generatorScript.groovy

似乎没有什么干扰我独立于Java编译独立执行脚本。

我该如何实现?

1 个答案:

答案 0 :(得分:1)

问题是您在main源集中有生成器groovy脚本,并且尝试编译该groovy脚本以将其用作您的JavaExec任务的类路径。我猜这就是执行compileJava任务的原因。

您可以采用另一种方式,使用groovy.ui.GroovyMain执行脚本,并使用基于this link的以下解决方案

configurations {
    // a dedicated Configuration for Groovy classpath
    groovyScript
}

dependencies {
    // Set Groovy dependency so groovy.ui.GroovyMain can be found.
    groovyScript localGroovy()
}

task generateClass(type: JavaExec) {

    // Set class path used for running Groovy command line.
    classpath = configurations.groovyScript

    // Main class that runs the Groovy command line.
    main = 'groovy.ui.GroovyMain'

    // Pass your groovy script as argument of the GroovyMain main
    // (can be improved)
    args 'src/main/groovy/generatorScript.groovy'

}