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

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

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

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


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


Ответы (2)


arrow_upward
3
arrow_downward

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

arrow_upward
2
arrow_downward

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