概要
GroovyはJVM上で動くので、利用するプログラム(class)はクラスパス上に存在している必要があります。
しかし、Groovyはまるでスクリプト言語のようにサクサク開発できるというのもその特徴/メリットの一つ。
スクリプト言語といえば、実行時にそのスクリプトから見た相対パスや、絶対パスで別のスクリプトを読み込んで利用することが出来ます。
PHPで言うところのrequireやincludeがそうですね。
スクリプト言語の素敵な特徴の一つだと思っているのですが、JVM上で動くGroovyだとそうは行きません。
ということで、とりあえずGroovyで、別のGroovyファイルをまるでPHPのrequireの用に読み込んで利用するサンプルを書いてみました。
残念ながら、読み込むファイル(requireに指定するファイル)でclassを宣言してしても、それは有効になりません。
この部分を今後何とか対応できるようにしてみたいですね。。。
サンプル
以下のコードが、実際に別のGroovyファイルを読み込んで実行しているものです。
def require = {String path, String reference = "that" ->
File myscript = new File(path)
Eval.me(reference, this, myscript.getText())
}
require("/home/koji/work/groovy/myscript.groovy") // この時点でThis is myscript.groovy. this script is loaded from ...とコンソールに表示される
// このファイルでは全く宣言していない変数が利用できるようになっている!
assert cljFromMyScriptGroovy() == "This is Closure in myscript.groovy"
assert textFromMyScriptGroovy == "hogehoge!"
読み込まれているGroovyファイルは以下のようになっています。普通のGroovyファイルです。
myscript.groovy
that.cljFromMyScriptGroovy = {-> "This is Closure in myscript.groovy"}
that.textFromMyScriptGroovy = "hogehoge!"
println "This is myscript.groovy. this script is loaded from ${that}"
// 残念ながらこの方法だとclassを定義しても、このファイルをrequireしてる方に反映させることは出来ない。。。
class Test {
def name = "Test class"
}