Я читал, как просто импортировать файл groovy в другой сценарий groovy
Я хочу определить общие функции в одном файле groovy и вызывать эти функции из других файлов groovy.
Я понимаю, что это будет использовать Groovy как язык сценариев, т.е. мне не нужны классы / объекты. Я пытаюсь сделать что-то вроде dsl, которое можно сделать в Groovy. Все переменные будут утверждены из Java, и я хочу выполнить отличный сценарий в оболочке.
Это вообще возможно ? Может кто-нибудь привести пример.
Ответы:
Поместите это в начало вашего сценария. Это приведет к содержимому отличного файла (просто замените имя файла в двойных кавычках на свой отличный сценарий).
Я делаю это с помощью класса, неожиданно названного "Tools.groovy".
источник
Начиная с Groovy 2.2, можно объявить базовый класс скрипта с новой
@BaseScript
аннотацией преобразования AST.Пример:
файл MainScript.groovy :
файл test.groovy :
источник
Другой способ сделать это - определить функции в классе Groovy, проанализировать и добавить файл в путь к классам во время выполнения:
источник
GroovyObject
явно, это не заполнитель для вашего собственного имени класса.Я думаю, что лучший выбор - организовать служебные вещи в виде отличных классов, добавить их в путь к классам и позволить основному скрипту обращаться к ним через ключевое слово import.
Пример:
скрипты / DbUtils.groovy
scripts / script1.groovy:
запущенный скрипт:
источник
lib
иsrc
каталоговЯ делаю это с помощью
GroovyShell
.источник
В Groovy нет ключевого слова import, как в типичных языках сценариев, которые будут буквально включать содержимое другого файла (здесь упоминается: Предоставляет ли Groovy механизм включения? ).
Из-за его объектно-классовой природы вы должны «играть в игры», чтобы такие вещи работали. Одна из возможностей - сделать все ваши служебные функции статическими (поскольку вы сказали, что они не используют объекты), а затем выполнить статический импорт в контексте исполняемой оболочки. Затем вы можете вызывать эти методы как «глобальные функции».
Другой вариант - использовать объект Binding ( http://groovy.codehaus.org/api/groovy/lang/Binding.html) при создании оболочки и привязке всех функций, которые вы хотите, к методам (недостатком здесь будет необходимость перечисления всех методов в привязке, но вы, возможно, можете использовать отражение). Еще одно решение - переопределить
methodMissing(...)
объект делегата, назначенный вашей оболочке, который позволяет вам в основном выполнять динамическую отправку с использованием карты или любого другого метода, который вы хотите.Некоторые из этих методов демонстрируются здесь: http://www.nextinstruction.com/blog/2012/01/08/creating-dsls-with-groovy/ . Дайте мне знать, если вы хотите увидеть пример конкретной техники.
источник
Как насчет того, чтобы рассматривать внешний скрипт как класс Java? На основе этой статьи: https://www.jmdawson.net/blog/2014/08/18/using-functions-from-one-groovy-script-in-another/
getThing.groovy Внешний скрипт
printThing.groovy Основной скрипт
Результат
источник
Вот полный пример включения одного скрипта в другой.
Просто запустите файл Testmain.groovy. Включены
пояснительные комментарии, потому что мне это нравится;]
Testutils.groovy
Testmain.groovy
источник
Для опоздавших, похоже, теперь groovy поддерживают
:load file-path
команду, которая просто перенаправляет ввод из заданного файла, поэтому теперь включение скриптов библиотеки является тривиальным делом.Он работает как ввод в groovysh и как строка в загруженном файле:
groovy:000> :load file1.groovy
file1.groovy может содержать:
:load path/to/another/file invoke_fn_from_file();
источник
:load file-path
?groovy:000> :load file1.groovy
file1.groovy может содержать: <br/>:load path/to/another/file
Комбинация ответов @grahamparks и @snowindy с парой модификаций - вот что сработало для моих скриптов Groovy, работающих на Tomcat:
Utils.groovy
MyScript.groovy:
источник
Groovy может импортировать другие классы Groovy точно так же, как это делает Java. Только убедитесь, что файл библиотеки имеет расширение .groovy.
источник
После некоторого исследования я пришел к выводу, что следующий подход кажется лучшим.
некоторые / подпакет / Util.groovy
example.groovy
Чтобы запустить
example.groovy
сценарий, добавьте его в системный путь и введите из любого каталога:Скрипт напечатает:
Приведенный выше пример был протестирован в следующей среде:
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
класса.Дополнительные комментарии / предложения:
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
.myScript.groovy
это имя сценария и имяMyClass.groovy
класса. Присвоение именmy-script.groovy
приведет к ошибкам времени выполнения в определенных сценариях, поскольку полученный класс не будет иметь допустимого имени класса Java.источник