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を介して実行するとか。

カテゴリー: 技術情報

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。