Почему я не могу выполнить вызов метода после объявления @Grab в скрипте Groovy? - PullRequest
17 голосов
/ 20 апреля 2011

Я пытаюсь создать DSL и использую Global AST Transform для этого. Скрипт отлично компилируется с groovyc, но я бы хотел, чтобы пользователь мог использовать Grab / Grape для извлечения JAR-файла и просто выполнить его сразу же, как отличный скрипт.

Затем я обнаружил, что не могу сделать это правильно, потому что в скрипте есть ошибка синтаксического анализа, если после вызова @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

Попытка разных вещей заставляет это работать, как оператор import:

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

Это ошибка в парсере?

Ответы [ 2 ]

16 голосов
/ 20 апреля 2011

Захват может применяться только как аннотация для определенных целей

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

Так что вам нужно аннотировать одну из этих вещей (как вы видите)

К сожалению, в Java (и, следовательно, в Groovy) нет способа, чтобы аннотации просто появлялись в середине кода.

0 голосов
/ 09 апреля 2018

проверить это

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