从gradle中运行groovy脚本

mac*_*ack 18 groovy gradle groovyclassloader

创建一个运行groovy脚本的gradle任务的最佳方法是什么?我意识到gradle构建文件是常规的,所以我认为可以做这样的事情:

task run << {
    Script app = new GroovyShell().parse(new File("examples/foo.groovy"))
    // or replace .parse() w/ a .evalulate()?
    app.run()
}
Run Code Online (Sandbox Code Playgroud)

如果bar.groovy正在使用@Grab注释甚至是简单的导入,那么当我尝试这个时,我会遇到各种各样的错误.我想创建一个任务的Gradle来处理这个问题,让我能有希望重用的类路径定义.

examples目录移动到某个地方的src目录会更好吗?什么是最佳做法?

小智 13

或者你可以这样做:

new GroovyShell().run(file('somePath'))
Run Code Online (Sandbox Code Playgroud)


xls*_*son 7

您可以尝试使用GroovyScriptEngine而不是GroovyShell.我之前使用过@Grab注释.你将需要类路径上的所有groovy,groovy-all.jar是不够的.我猜Ivy没有打包在groovy-all.jar中.这样的事情应该是诀窍:

这个脚本假定在/tmp/HelloWorld.groovy上有一个groovy脚本

def pathToFolderOfScript = '/tmp'
def gse = new GroovyScriptEngine([pathToFolderOfScript] as String[])
gse.run('HelloWorld.groovy', new Binding())
Run Code Online (Sandbox Code Playgroud)


noa*_*oah 1

我认为您可能需要将脚本作为新进程运行...例如,

["groovy","examples/foo.groovy"].execute()
Run Code Online (Sandbox Code Playgroud)

我猜想 Gradle 的执行方式不是通过调用groovy,因此使 @Grab 工作的设置永远不会发生。也可能是 Gradle 使用的 Groovy 版本不支持 @Grab。

  • 与此处的其他建议不同,此建议要求用户独立安装 Groovy。Gradle 不提供“groovy”、“groovy.bat”等。对于使用 Gradle 构建的应用程序来说,这是一个不可接受的要求,因为 gradlew 用于消除甚至不需要独立安装 Gradle 系统的需要。 (4认同)