如何在另一个Java进程中从Gradle任务运行Groovy脚本?

1aaf6o9v  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(130)

假设您有一个以System.exit(...)调用结束的Groovy脚本,并且您希望在Gradle任务中执行此Groovy脚本。由于System.exit调用将终止整个JVM,因此您希望在另一个Java进程中运行此脚本(由于System.exit调用的原因,使用GroovyShell似乎不是一个选项)。在不使用单独的Groovy安装的groovy命令的情况下,如何实现这一点呢?
如果这样的东西可能工作,我必须如何替换???????

javaexec {
    classpath = ???
    mainClass = ????
    args = ['my-script.groovy']
  }

[编辑]好吧,下面是一个“最小可重复的例子”,如下面的评论中所提到的,如果这样可以更好地理解这个问题的话:
Groovy脚本:

// file: my-script.groovy

    println 'Hello World'
    System.exit(0)

Gradle任务(这可能是完全错误的,我不知道如何替换问号):

task runMyScript(type: JavaExec) {
  classpath = ???
  mainClass = ????
  args = ['my-script.groovy']
}
m3eecexj

m3eecexj1#

如何使用java命令行运行groovy脚本,你可以在groovy shell/batches中检查:
https://github.com/apache/groovy/blob/master/src/bin/groovy.bat#L30

java -cp "$GROOVY_HOME/lib" groovy.ui.GroovyMain myscript.groovy

唯一问题是找出groovy-all通常所在的gradle/lib文件夹
我可以直截了当地建议:

def groovyJar = new File(groovy.ui.GroovyMain.getProtectionDomain().getCodeSource()?.getLocation()?.toURI())

或者如上所述使用javaexec时,它是:

javaexec {
    classpath = files(groovy.ui.GroovyMain.protectionDomain.codeSource.location)
    mainClass = 'groovy.ui.GroovyMain'
    args = ['my-script.groovy']
  }
6tdlim6h

6tdlim6h2#

另一种解决方案似乎是:
将以下内容添加到build.gradle

configurations {
  groovyScript
}

dependencies {
  groovyScript localGroovy()
  ...
}

以后用途:

javaexec {
    classpath = configurations.groovyScript
    mainClass = 'groovy.ui.GroovyMain'
    args = ['my-script.groovy']
  }

我刚刚在网上看到这个。我真的不明白这到底是在做什么。如果有人能解释一下,那就太好了。TYVMIA

相关问题