为什么在Groovy脚本中的@Grab声明之后无法执行方法调用?

17

我正在尝试构建一种DSL,并使用全局AST转换来完成。使用groovyc编译脚本没有问题,但是我想让用户使用Grab/Grape来拉取JAR,然后立即像Groovy脚本一样执行。

但我发现,如果在@Grab调用后没有方法声明或导入语句,就会出现解析错误,无法正确执行。

以下是一个示例:

@Grab(group='mysql', module='mysql-connector-java', version='5.1.6')

println "Hello World!"

看起来应该可以工作,但它报错了(这里是GroovyConsole脚本的输出):

startup failed:
Script1.groovy: 4: unexpected token: println @ line 4, column 1.
   println "hello"
   ^

1 error

尝试不同的方法可以使其正常工作,比如使用一个导入语句:

@Grab(group='mysql', module='mysql-connector-java', version='5.1.6')
import groovy.lang.Object
println "Hello World!" ​

或者是一个方法声明:

@Grab(group='mysql', module='mysql-connector-java', version='5.1.6')
def hello() {}
println "Hello World!"

这是解析器的一个bug吗?


目前(7年后!v 2.4.13),import groovy.lang.Object会出现“无法解析类”的错误。我改成了java.lang.Object - mike rodent
2个回答

16

Grab只能作为特定目标的注释应用。

@Target(value={CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PARAMETER,TYPE})

所以你需要注释其中一件事情(就像你现在看到的那样)

不幸的是,在Java(因此也包括Groovy)中,无法让注释仅出现在代码的中间部分。


2
你说的有道理,但我认为从常识角度来看,上面的例子仍然应该有效,因为包括类型和方法在内的许多隐式内容被创建了。虽然它不是出现在代码中间,但我可以理解在词法上存在一些问题。 - Phuong LeCong

0

测试一下

import static groovy.grape.Grape.grab
grab(group: "mysql", module: "mysql-connector-java", version: "5.1.6")
println "Hello World!"

这是文档中推荐的在Groovy脚本文件中加载依赖项的方式,而不是在Groovy类文件中。注释适用于Groovy类文件:http://docs.groovy-lang.org/latest/html/documentation/grape.html - Glushiator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接