0

我有一个使用多个 groovy 脚本的 Java 应用程序,这些脚本在编译后使用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

有没有其他方法可以直接加载已编译的 groovy 类?

4

1 回答 1

0

我想通了,只需按预期URLClassLoader为工程的构造函数提供相同的目录。GroovyShell

于 2016-06-23T18:01:03.820 回答