Після деякого розслідування я дійшов висновку, що наступний підхід видається найкращим.
деякі / субпакет / Util.groovy
@GrabResolver(name = 'nexus', root = 'https://local-nexus-server:8443/repository/maven-public', m2Compatible = true)
@Grab('com.google.errorprone:error_prone_annotations:2.1.3')
@Grab('com.google.guava:guava:23.0')
@GrabExclude('com.google.errorprone:error_prone_annotations')
import com.google.common.base.Strings
class Util {
void msg(int a, String b, Map c) {
println 'Message printed by msg method inside Util.groovy'
println "Print 5 asterisks using the Guava dependency ${Strings.repeat("*", 5)}"
println "Arguments are a=$a, b=$b, c=$c"
}
}
приклад.groovy
#!/usr/bin/env groovy
Class clazz = new GroovyClassLoader().parseClass("${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy" as File)
GroovyObject u = clazz.newInstance()
u.msg(1, 'b', [a: 'b', c: 'd'])
Для запуску example.groovy
сценарію додайте його до системного шляху та введіть з будь-якого каталогу:
example.groovy
Сценарій друкує:
Message printed by msg method inside Util.groovy
Print 5 asterisks using the Guava dependency *****
Arguments are a=1, b=b, c=[a:b, c:d]
Наведений приклад був протестований у наступному середовищі: Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
Приклад демонструє наступне:
- Як користуватися
Util
класом всередині грозового сценарію.
Util
Клас виклику Guava
бібліотеки третьої сторони, включивши його в якості Grape
залежності ( @Grab('com.google.guava:guava:23.0')
).
Util
Клас може перебувати в підкаталозі.
- Передача аргументів методу в межах
Util
класу.
Додаткові коментарі / пропозиції:
- Завжди використовуйте клас groovy замість скрипта groovy для багаторазового використання у ваших скриптах groovy. У наведеному вище прикладі використовується клас Util, визначений у файлі Util.groovy. Використання груві-скриптів для багаторазового використання є проблематичним. Наприклад, якщо використовувати groovy скрипт, то клас Util повинен був би бути створений у нижній частині скрипту
new Util()
, але найголовніше, щоб він був розміщений у файлі з іменем що-небудь, крім Util.groovy. Докладніші відомості про відмінності між скрипучими сценаріями та кладовими groovy див. У розділі Сценарії проти класів.
- У наведеному вище прикладі я використовую шлях
"${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
замість "some/subpackage/Util.groovy"
. Це гарантуватиме, що Util.groovy
файл завжди буде знайдений щодо розташування скрипта groovy ( example.groovy
), а не до поточного робочого каталогу. Наприклад, використання "some/subpackage/Util.groovy"
призведе до пошуку в WORK_DIR/some/subpackage/Util.groovy
.
- Дотримуйтесь конвенції про іменування класу Java, щоб називати ваші громіздкі сценарії. Я особисто віддаю перевагу невеликому відхиленню, коли сценарії починаються з нижньої літери замість великої. Наприклад,
myScript.groovy
це ім'я сценарію, і MyClass.groovy
це ім'я класу. Іменування my-script.groovy
призведе до помилок під час виконання в певних сценаріях, оскільки в результаті класу не буде дійсного імені класу Java.
- Загалом у світі JVM відповідна функціональність називається JSR 223: Сценарій для Java . Зокрема, в groovy функціональність називається механізмами інтеграції Groovy . Насправді той самий підхід можна використовувати для виклику будь-якої мови JVM зсередини Groovy або Java. Деякі помітні приклади таких мов JVM - Groovy, Java, Scala, JRuby та JavaScript (Rhino).