Groovy - можно ли загрузить бинарный класс?

У меня есть приложение Java, которое использует несколько groovy-скриптов, скрипты кэшируются в памяти после компиляции с использованием метода GroovyShell.parse(text).

Можно ли скомпилировать этот скрипт только один раз и сохранить бинарные классы на диске/базе данных? Следующий код будет хранить двоичные классы в /tmp;

    CompilerConfiguration compilerConfiguration=new CompilerConfiguration();
    compilerConfiguration.setTargetDirectory("/tmp/");
    GroovyShell shell=new GroovyShell(compilerConfiguration);
    shell.parse("println 'foo';","myScript1");
    shell.parse("println 'bar';","myScript2");

После запуска этого кода я вижу myScript1.class и myScript2.class в каталоге /tmp/, но попытка использовать приведенный выше код для загрузки классов ПОСЛЕ перезапуска приложения (чтобы не было необходимости в перекомпиляции) терпит неудачу:

    CompilerConfiguration compilerConfiguration=new CompilerConfiguration();
    compilerConfiguration.setTargetDirectory("/tmp/");
    GroovyShell shell=new GroovyShell(compilerConfiguration);
    Class clazz=shell.getClassLoader().loadClass("myScript1");

Из исходного кода GroovyClassLoader я не вижу никакого способа загрузки двоичных классов, кроме метода defineClass(java.lang.String, byte[]), который дает следующее исключение при попытке загрузить классы:

Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 2901213189 in class file myScript1

Есть ли другой способ прямой загрузки скомпилированных классных классов?


person Pma    schedule 23.06.2016    source источник
comment
В противном случае вы можете скомпилировать и создать банку и добавить ее в путь к классу? Предоставленный сценарий находится в классе, я думаю   -  person Rao    schedule 23.06.2016


Ответы (1)


Я понял это, просто предоставив URLClassLoader тот же каталог для конструктора GroovyShell, работает, как и ожидалось.

person Pma    schedule 23.06.2016