HTTPサーバ上で公開したgroovyスクリプト群を、コードベースURLを与えて実行するには以下のコードでよい。
ClassLoader tClassLoader = new URLClassLoader(new URL[] { new URL("http://kurusugawa.jp/groovy/") });
GroovyShell tGroovyShell = new GroovyShell(tClassLoader);
tGroovyShell.evaluate("ほげほげ");
ただし、Tomcat等のアプリケーションサーバにデプロイした場合、セキュリティの都合でSystemClassLoaderが取得できないらしく、こんな感じの例外が起きる。
java.lang.NoClassDefFoundError: groovy/lang/Script at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at groovy.lang.GroovyClassLoader.access$300(GroovyClassLoader.java:76) at groovy.lang.GroovyClassLoader$ClassCollector.createClass(GroovyClassLoader.java:433) at groovy.lang.GroovyClassLoader$ClassCollector.onClassNode(GroovyClassLoader.java:451) at groovy.lang.GroovyClassLoader$ClassCollector.call(GroovyClassLoader.java:455) at org.codehaus.groovy.control.CompilationUnit$8.call(CompilationUnit.java:691) at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:881) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:435) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:290) at groovy.lang.GroovyShell.parseClass(GroovyShell.java:484) at groovy.lang.GroovyShell.parse(GroovyShell.java:496) at groovy.lang.GroovyShell.parse(GroovyShell.java:476) at groovy.lang.GroovyShell.evaluate(GroovyShell.java:454) at groovy.lang.GroovyShell.evaluate(GroovyShell.java:430)
この例外は親クラスローダを指定してやれば起きなくなる。
ClassLoader tClassLoader = new URLClassLoader(new URL[] { new URL("http://kurusugawa.jp/groovy/") }, MyClass.class.getClassLoader());
URLClassLoaderを介してgroovyスクリプトを実行できるので、使い道は色々ありそう。
分かりやすいところでは、Subversionに投入してあるgroovyスクリプトをmod_svnを介して実行するとか。