|
Groovyは、
Java VM内で動作する、非常に新しいスクリプト言語です。
一時はJava SE6に同梱されるという説がありましたが、
JavaScriptのJava実装であるRhinoにその座を奪われてしまいました。
さはあれど、活発に開発が行われています。
-
総本山からダウンロードし、
任意のディレクトリに展開します。
-
環境変数
JAVA_HOME、
GROOVY_HOME、
PATH (${GROOVY_HOME}/binを含める)
を設定します。
-
${GROOVY_HOME}/binのgroovyやgroovyshで実行します。
なお、Groovyスクリプトの標準的な拡張子は.groovyですが、
長いので.gvや.gyとされているオープンソースのサンプルもあります。
Groovyのアーカイブを展開すると、
groovy-1.5.4.jarとgroovy-all-1.5.4.jarという2つのJARファイルが入っています。
groovy-***.jarは、libディレクトリに置かれているその他の約20種類ものさまざまなライブラリのJARファイルに依存しています。
別の言い方をすると、それらにも全てCLASSPATHを通さないといけません。
groovyコマンドをコマンドラインで使うだけということなら、
その作業はgroovyがやってくれるので不要なのですが、
Groovy処理系のJavaクラス「groovy.ui.GroovyMain」を自分のJavaコードから呼び出す場合、
付属のjar全てにCLASSPATHを通すのは一苦労です。
そのような場合には、
embeddableディレクトリに置かれているgroovy-all-***.jarの方を使いましょう。
必要なクラスは全てこの中に入っているので、これにCLASSPATHを通すだけで、
Groovy処理系を使って処理を行わせることができます。
Groovyを実行するためのantファイルのテンプレート |
カレントディレクトリに以下のbuild.xmlを置いておけば、
コマンドラインプロンプトから「ant -Dscript=mysample.gv」のようにして実行できます。
<project name="default" default="run.groovy" basedir=".">
<property name="GROOVY_HOME" value="C:/Wintools2/groovy-1.5.4" />
<property name="JAVALIBDIR" value="C:/usr/java/lib" />
<property name="TOMCATLIBDIR" value="C:/Wintools2/Tomcat-5.5.20/shared/lib" />
<property name="HSQLDBLIBDIR" value="C:/Wintools2/hsqldb/lib" />
<property name="classpath" value="." />
<!-- specify using -Dscript={script_file_name} option -->
<property name="script" value="" />
<target name="run.groovy">
<java classname="groovy.ui.GroovyMain" fork="yes">
<classpath>
<pathelement path="${classpath}" />
<pathelement location="${GROOVY_HOME}/embeddable/groovy-all-1.5.4.jar" />
<pathelement location="${HSQLDBLIBDIR}/hsqldb.jar" />
<pathelement location="${JAVALIBDIR}/xalan/xalan.jar" />
<pathelement location="${JAVALIBDIR}/xalan/xercesImpl.jar" />
<pathelement location="${JAVALIBDIR}/xalan/xml-apis.jar" />
</classpath>
<arg value="${script}" />
</java>
</target>
</project>
|
Groovyの文法は、ぱっと見「Java?」というくらいよく似ているので、
違いだけを列挙してみましょう。
-
文をクラスにまとめる必要はない。PerlやPythonなどと同様、
スクリプト冒頭からいきなり文を書き始めてよい。
※クラスやメソッドは、それが使われるよりも後ろに定義されていてもよい。
-
文末セミコロンは省略可能。
-
forループ構文はJavaとはまったく違う「in」を使った構文がある。例えばJavaの
for(int i=0; i<nodes.getLength(); i++)
は
for(i in 0 .. nodes.length)
のように書く。
※Groovy 1.5以降、一応Java形式の構文と両方使えるようになりました。
GroovyからすればJava形式のfor構文ははっきり言って冗長なんですけど、
ユーザの熱望もあってサポートされたそうです。
-
return文のreturnキーワードは省略可能。Perlのように、最後に評価された値が返る。
-
型宣言は省略でき、後から違う型の値を代入することも可。またauto-boxing機能もあり。
-
print, println, dumpという組み込みメソッドがある。
-
invokeMethod()で動的にメソッドを呼び出せる。
-
文字列はPerlやPythonのように、一重引用符でも二重引用符でも囲める。
-
二重引用符で囲んだ文字列の中に、「${式}」と書くと、
PerlやBシェルのように式の値が置き換わって埋め込まれる。
-
二重引用符での文字列表現は、途中で改行されても閉じるまで有効。
またPHP風のヒアドキュメント(<<<EOS)や、
Python風の3つ並んだ二重引用符で囲んで複数行の文字列を表現することもできる。
-
Stringに、contains, count, tokenize, minus, multiply
の各メソッドが追加されている。
-
正規表現のために、Java SE regexのPatternやMatcherに対応する演算子が幾つかある。
-
演算子はオーバーロードされている。例えば文字列は==で比較できる。
Javaの==、つまり完全に同一メモリにあるオブジェクトかどうかの比較はGroovyでは===。
Javaのa.compareTo(b)はPerlのように a <=> bと書ける。
またnullは比較演算においては限りなく小さい値として扱われる。
-
Mapに対する演算子 a[key] は a.get(key) の意味。
またa[key] = value は a.set(key, value)の意味。
-
java.io.*、java.util.*
は最初からインポートされているので、明示的にimport文を書く必要はない。
-
クロージャのサポート
-
クラスのインスタンス変数は、privateを明示的につけない限り、setter/getterが自動生成される。
-
メソッド引数を囲む括弧は省略可能なことがある(コンストラクタの引数の括弧は省略不可)
Groovyスクリプトに渡されたコマンドライン引数は、変数argsに配列として入っています。
args[0]から順番に取り出されます。Javaと同じく、
渡されたより多くの引数を取り出そうとすると、ArrayIndexOutOfBoundsExceptionが発生します。
println "[0]=[" + args[0] + "]"
for(arg in args){
println "arg:" + arg
}
|
Groovyでは配列状のモノを簡単に
と角括弧を使って定義できますが、これは配列ではなくJavaでいうjava.util.ArrayListを定義しています。
配列とリストを相互に変換するにはtoArray()、toList()メソッドを使う手もありますが、
ArrayList.toArray()を使っても、プリミティブデータ型の配列には変換できません。
最初からプリミティブデータ型の配列を定義したい場合は、
データ型を添えて以下のように書きます。
float[] widths = [10,20,40,30]
|
これはJavaの配列定義によく似ていますが、中括弧ではなく角括弧を使う点に注意してください。
(first uploaded 2007/03/17 last updated 2008/02/24, URANO398)
|