После некоторого исследования я пришел к выводу, что следующий подход кажется лучшим.
некоторые / подпакет / 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"
}
}
example.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 script для многоразовой функциональности в ваших Groovy скриптах. В приведенном выше примере используется класс Util, определенный в файле Util.groovy. Использование Groovy-скриптов для многократного использования проблематично. Например, при использовании отличного сценария класс Util должен быть создан в нижней части сценария
new Util()
, но, что наиболее важно, он должен быть помещен в файл с именем, отличным от Util.groovy. Обратитесь к Сценариям и классам для получения дополнительных сведений о различиях между 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: Scripting for the Java . В частности, в Groovy эта функция называется механизмами интеграции Groovy . Фактически, тот же подход можно использовать для вызова любого языка JVM из Groovy или Java. Некоторыми известными примерами таких языков JVM являются Groovy, Java, Scala, JRuby и JavaScript (Rhino).