У меня есть приложение 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
Есть ли другой способ прямой загрузки скомпилированных классных классов?