Каковы плюсы и минусы использования GroovyClassLoader и GroovyShell

Мне нужно запустить некоторый внешний код из моего Java-приложения, который будет часто обновляться и ортогонально по отношению к остальной части приложения. Поскольку я не хочу повторно развертывать все приложение при каждом изменении кода (а также по другим причинам), мы решили использовать groovy для этого кода и сохраните его либо в файловой системе, либо в базе данных.

Из документации я понимаю, что у меня есть два способа запуска кода: использование GroovyShell или GroovyClassLoader (eval здесь не подходит)

Каковы плюсы и минусы каждого метода?


person David Rabinowitz    schedule 01.10.2009    source источник


Ответы (2)


GroovyShell использует GroovyClassLoader внизу. Используйте GroovyShell, если вам не нужна функция, предоставляемая только GroovyClassLoader.

person Peter Niederwieser    schedule 04.10.2009
comment
Но кэширует ли GroovyShell исполняемый скрипт? - person David Rabinowitz; 05.10.2009
comment
я не эксперт, я только начинаю собственное встраивание groovyshell, но класс конфигурации компилятора включает /** * Получает целевой каталог для написания классов. */ public File getTargetDirectory() { return this.targetDirectory; } - person mP.; 27.06.2011

GroovyShell использует загрузчик классов по умолчанию до тех пор, пока вы не загрузите что-то в сценарии, который настраивает путь к классам, затем он переключается на пользовательский GroovyClassLoader, что может вызвать проблемы с загрузкой некоторых драйверов jdbc или элементов jndi и т. д. Итак, если ваш загрузчик классов по умолчанию уже имеет classpath, который ему нужен, и , и если вы можете избежать создания экземпляра нового объекта GroovyClassLoader в своем коде Java, то загрузка сценария оболочки с помощью простого GroovyShell будет использовать загрузчик классов по умолчанию, и вам будет лучше для него.

Надеюсь, я понял ваш вопрос.

person djangofan    schedule 07.12.2011
comment
У меня есть Java-приложение, которое оборачивает некоторую логику, написанную на пользовательском DSL в groovy. Код приложения Java меняется редко, код groovy (DSL) меняется часто. Я не хочу, чтобы код DSL каждый раз интерпретировался, а должен быть скомпилирован в байт-код для последующего выполнения. Может ли GroovyShell сделать это? - person David Rabinowitz; 08.12.2011
comment
Если вы намерены компилировать в байт-код, то зачем использовать Groovy? Кроме того, часть, которая часто изменяется, кажется подходящей для динамической компиляции, а не для предварительной компиляции. Лично для DSL я бы использовал XTend, а не Groovy. У каждого человека свои предпочтения. - person djangofan; 11.10.2012
comment
Частые изменения означает, что один скрипт можно менять раз в месяц, но всего в день вносятся десятки изменений (у нас более 2500 скриптов, которыми мы управляем). Итак, у нас достаточно изменений, которые мы не хотим переустанавливать, но каждый код меняется редко, поэтому я хочу, чтобы он соблюдался. По поводу XTend - выглядит симпатично, но вопросы: а) можно ли загрузить его динамически; и (б) каков размер сообщества, стоящего за этим. - person David Rabinowitz; 11.10.2012