【问题标题】:Why can't I do a method call after a @Grab declaration in a Groovy script?为什么我不能在 Groovy 脚本中的 @Grab 声明之后进行方法调用?
【发布时间】:2011-04-20 08:10:56
【问题描述】:

我正在尝试构建一个 DSL 并使用全局 AST 转换来完成它。该脚本正在使用groovyc 进行编译,但我希望能够让用户使用 Grab/Grape 来拉取 JAR 并让它作为一个 groovy 脚本立即执行。

然后我发现我无法正确执行它,因为如果在@Grab调用之后没有方法声明或导入语句,则脚本中存在解析错误。

这是一个例子:

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

println "Hello World!"

它看起来应该可以工作,但它抱怨(这是GroovyConsole Script的输出):

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!"

这是解析器中的错误吗? ​

【问题讨论】:

  • 当前时间(7 年后!v 2.4.13)import groovy.lang.Object 给出“无法解析类”错误。我改用java.lang.Object

标签: syntax groovy abstract-syntax-tree


【解决方案1】:

Grab 只能作为annotation to certain targets 应用

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

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

不幸的是,Java(以及 Groovy)中没有办法让注释只出现在代码中间。

【讨论】:

  • 你说的有道理,但我想我认为从常识的角度来看,上面的例子应该仍然有效,因为创建了很多隐含的东西,包括类型和方法。它没有出现在代码中间,但我可以理解在词法上存在一些问题。
【解决方案2】:

测试一下

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2010-09-06
  • 2012-08-17
相关资源
最近更新 更多