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



我有一个 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 编译单独执行脚本。

我怎样才能做到这一点?

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

您可以通过另一种方式,使用groovy.ui.GroovyMain来执行脚本,并基于此链接使用以下解决方案

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'
}

最新更新