これが機能しないためには、脳死した愚かなことをしなければならないことはわかっていますが、実行中のサーバーに動作を動的にロードしたい状況にあります。これを行うためのツールとして groovy を選択しました。この動作では、モデル オブジェクトや Freemarker などのサード パーティ ライブラリなど、サーバーのクラスパス上のクラスを参照する必要があります。
実現可能性を示すために、このばかげた POC をまとめました。GroovyClassPath の親クラスパスを現在のパスに設定しているにもかかわらず、Groovy スクリプトで Java クラス "ThingyDoodle" および "Fooable" を解決できません。
public class GroovyTest
{
public static void main ( String [ ] argv ) throws Throwable
{
// Setting parent classloader!
// also tried plain old "GroovyTest.class.getClassLoader()" as well
GroovyClassLoader gcl = new GroovyClassLoader ( Thread.currentThread().getContextClassLoader() ) ;
String src =
"class Arf implements Fooable {
public String foo ( ) {
return new ThingyDoodle().doStuff('Arf');}}" ;
Class clazz = gcl.parseClass(src, "AppleSauce.groovy");
Object aScript = clazz.newInstance();
Fooable myObject = (Fooable) aScript;
System.out.println ( myObject.foo() ) ;
}
public static interface Fooable { public String foo ( ) ; }
public static class ThingyDoodle
{
public String doStuff ( String input )
{
return "Hi Worlds" ;
}
}
}
ここで私は一体何を間違っているのですか?
Exception in thread "main" org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
AppleSauce.groovy: 1: unable to resolve class Fooable
@ line 1, column 1.
class Arf implements Fooable { public String foo ( ) { return new ThingyDoodle().doStuff('Arf');}}
^
AppleSauce.groovy: 1: unable to resolve class ThingyDoodle
@ line 1, column 63.
ublic String foo ( ) { return new Thingy
^