Groovyがインストールされていない環境での実行ではまった

1.8から以下のように実行する事でGroovyがインストールされていない環境でもGroovyを直接実行することができるようになりました。
(1.7以下でもできたみたいですが、面倒だった?)

java -jar C:\groovy\groovy-1.8.6\embeddable\groovy-all-1.8.6.jar c:\work\test.groovy

先日「プログラミングGroovy」を読み直すまでこの事を気づかずに、毎回classにコンパイルしていた私は狂喜乱舞したんですが。。。

実は落とし穴があり、「CLASSPATH」の設定は無効になります。
勿論「-cp」で指定しても無効です。

どういうことかというと、こんな感じ。

C:\work\test.groovy

assert System.getProperty("java.class.path") == /C:\groovy\groovy-1.8.6\embeddable\groovy-all-1.8.6.jar/

こいつをクラスパスにその辺に転がっていたjarを指定して適当に実行してみると。。。

java -cp "C:\tomcat50\shared\lib\mysql-connector-java-5.1.7-bin.jar" -jar C:\groovy\groovy-1.8.6\embeddable\groovy-all-1.8.6.jar C:\work\test.groovy

C:\>java -cp "C:\mysql-connector-java-5.1.7-bin.jar" -jar C:\groovy\groovy-1.8.6\embeddable\groovy-all-1.8.6.jar C:\work\test.groovy

C:\>

正しく実行されちゃいます。(クラスパスに指定したjarが設定されていません)

これはjavaコマンド、「-jar」オプションの仕様のようです。

このオプションを使用すると、指定した JAR ファイルがすべてのユーザークラスのソースになり、ユーザークラスパスのほかの設定は無視されます。
http://java.sun.com/javase/ja/6/docs/ja/technotes/tools/windows/java.html

どうやら、OracleのBug Databaseにあがってるみたいです。
2001年にあがってますので、直す気ないんでしょうねぇ。。。

■まとめ
・外部jarが不要な場合
groovy-all-X.X.X.jarを使用して実行
例 : java -jar C:\groovy\groovy-1.8.6\embeddable\groovy-all-1.8.6.jar c:\work\test.groovy

・外部jarが必要な場合
コンパイルして実行

例 :

javac c:\work\test.groovy
java -cp "C:\mysql-connector-java-5.1.7-bin.jar" test