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.classmyScript2.class/tmp/上記のコードを使用してアプリケーションの再起動後にクラスをロードしようとすると (再コンパイルの必要がないため) 失敗します:

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

iのソース コードから、メソッド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 に答える