倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Groovy スクリプトを実行するバッチファイル

こちらの記事で、Groovy をインストールしていない環境で Groovy スクリプトを実行する方法が書かれてました。 この方法では、スクリプトの実行に必要な Groovy と Ivy*1 の Jar ファイル自体は実行者に用意してもらう必要がありました。

最近、Clojure の勉強にと思って Leiningen というツールをイジってたんですが*2、このツールでは Clojure の Jar はもちろん、Leiningen の Jar すらもツールによってダウンロードしちゃおう!ってやつで、ユーザーがダウンロードする必要があるのはシェル・スクリプト(*nix、Mac 上)もしくはバッチ・ファイル(Windows)だけ、という手軽極まりない(?)ユーザビリティとなっております。 んで、これをちょっと Groovy スクリプトの実行に応用してみよう!と試行錯誤してみました。 以下、Windows の話です。 しかも、たぶん win32 系のみ。

参考

準備


ここで行う方法と参考記事「作成したGroovyスクリプトをGroovy未インストール環境で使ってもらう」で行っている方法との違いは、必要な Jar ファイル(groovy-all-x.x.x.jar, ivy-x.x.x.jar)をバッチファイルからダウンロードしてやろう!ってところですが、そのためには OS ネイティブなツールを使わないといけないのが難点*3。 この辺りが WORA を信条とする Java プログラマには取っつきにくいところ。 まぁ我慢。

Leiningen では Leiningen の Jar ファイルをダウンロードするのに wget というツール(コマンド)を使ってますが、Windows ではデフォルトで使用できないので、まずこのツールをインストールしなければいけません。 それができれば、後はバッチファイルを実行するだけです。

wget のインストール

wget は以下のサイト

から exe ファイルがダウンロード出来ます。 直で exe ファイルが置かれてるのもちょっとコワイですがw 使用方法やライセンスをまとめた zip ファイルは

から取得できます。 この zip ファイルを展開して bin フォルダにある wget.exe を使っても構いません。

ともかく、この wget.exe ファイルを PATH 上、もしくは実行したい Groovy スクリプトと同じフォルダ上に配置します。 wget のインストールはこれだけ*4

バッチファイルの配備

次はバッチファイルの配備。 といっても、以下のファイル

  • qroovy.bat 直 (←「groovy.bat」ではなく「qroovy.bat」ね。)

をダウンロードして、wget.exe と同様に PATH 上もしくは実行したい Groovy スクリプトと同じフォルダ上に置きます。 ちなみにバッチファイルの内容はこんなの:

@echo off

:: Configurable variables
if "%GROOVY_VERSION%" == "" set GROOVY_VERSION=2.0.1
if "%IVY_VERSION%" == "" set IVY_VERSION=2.2.0
if "%QROOVY_REPO%" == "" set QROOVY_REPO=%USERPROFILE%\.qroovy
if "%JAVA_CMD%" == "" set JAVA_CMD="java"
if "%JVM_OPTS%" == "" set JVM_OPTS=%JAVA_OPTS%

setLocal EnableExtensions EnableDelayedExpansion

:: Fixed variables
set GROOVY_JAR=!QROOVY_REPO!\groovy-all-!GROOVY_VERSION!.jar
set GROOVY_JAR_URL=http://repo1.maven.org/maven2/org/codehaus/groovy/groovy-all/%GROOVY_VERSION%/groovy-all-%GROOVY_VERSION%.jar
set IVY_JAR=!QROOVY_REPO!\ivy-!IVY_VERSION!.jar
set IVY_JAR_URL=http://repo1.maven.org/maven2/org/apache/ivy/ivy/%IVY_VERSION%/ivy-%IVY_VERSION%.jar

set ORIGINAL_PWD=%CD%
:: If ORIGINAL_PWD ends with a backslash (such as C:\),
:: we need to escape it with a second backslash.
if "%ORIGINAL_PWD:~-1%x" == "\x" set "ORIGINAL_PWD=%ORIGINAL_PWD%\"

:: Download jar files if not exists.
for %%f in ("%GROOVY_JAR%") do set QROOVY_REPO="%%~dpf"
if not exist %QROOVY_REPO% mkdir %QROOVY_REPO%

set HTTP_CLIENT=wget --no-check-certificate -O
wget>nul 2>&1
if ERRORLEVEL 9009 (
    curl>nul 2>&1
    if ERRORLEVEL 9009 goto NO_HTTP_CLIENT
    set HTTP_CLIENT=curl --insecure -f -L -o
)

if not exist "%GROOVY_JAR%" (
    echo Downloading Groovy now...
    %HTTP_CLIENT% "%GROOVY_JAR%" %GROOVY_JAR_URL%
    if ERRORLEVEL 1 (
        del %GROOVY_JAR%>nul 2>&1
        echo.
        echo Failed to download %GROOVY_JAR_URL%
        echo.
        goto EOF
    )
)

if not exist "%IVY_JAR%" (
    echo Downloading ivy now...
    %HTTP_CLIENT% "%IVY_JAR%" %IVY_JAR_URL%
    if ERRORLEVEL 1 (
        del %IVY_JAR%>nul 2>&1
        echo.
        echo Failed to download %IVY_JAR_URL%
        echo.
        goto EOF
    )
)
goto RUN

:NO_HTTP_CLIENT
echo.
echo ERROR: Wget/Curl not found. Make sure at least either of Wget and Curl is
echo        installed and is in PATH. You can get them from URLs below:
echo.
echo Wget: "http://users.ugent.be/~bpuype/wget/"
echo Curl: "http://curl.haxx.se/dlwiz/?type=bin&os=Win32&flav=-&ver=2000/XP"
echo.
goto EOF


:RUN
if not "%DEBUG%" == "" echo CLASSPATH=!CLASSPATH!
:: ##################################################

setLocal DisableDelayedExpansion

%JAVA_CMD% %JVM_OPTS% -cp "%GROOVY_JAR%;%IVY_JAR%" groovy.ui.GroovyMain %*

:EOF

wget コマンドは --no-check-certificate オプションを付けて実行しているので、セキュアじゃございません。 実行は自己責任で

準備完了?

以下の2つのファイル

  • wget.exe
  • qroovy.bat

が PATH 上もしくは Groovy スクリプトと同じフォルダ上に配置されてますかね? それなら準備完了。

スクリプトの実行


さて、ではスクリプトの実行。 hello.groovy という Groovy スクリプトを実行したいなら

qroovy hello.groovy

というコマンドを実行します(拡張子 .groovy は省略可)。 コマンドは「groovy」ではなく「qroovy」。 設定がキチンとできていれば、groovy-all-2.0.1.jar, ivy-2.2.0.jar がダウンロードされて*5 Groovy スクリプトが実行されるハズです。 ちなみに、Leiningen では、Leiningen 自体をインストールするために最初「lein self-install」といったコマンドを実行する必要がありましたが、上記のバッチファイルでは必要ありません。

もちろん参考元test.gr も動きます:

set JAVA_OPTS=-Dgroovy.source.encoding=UTF-8 -Dfile.encoding=UTF-8
qroovy test.gr

つまるところ、@Grab で Java ライブラリをダウンロードできますヨってことです。

設定できる変数


上記のバッチファイルには、いくつか設定できる変数があります:

変数名 説明 デフォルト値
GROOVY_VERSION 使用する Groovy のバージョン 2.0.1
IVY_VERSION 使用する Ivy のバージョン 2.2.0
QROOVY_REPO ダウンロードした Jar ファイルの格納場所 %USERPROFILE%\.qroovy*6
JAVA_CMD 使用する Java 実行コマンド java
JVM_OPT(JAVA_OPT) Java 実行コマンドに渡すパラメータ

例えば、デフォルトでは使用される Groovy のバージョンは 2.0.1 ですが、別バージョンの Groovy を使いたいときにはコマンド・プロンプト上で

set GROOVY_VERSION=1.8.7
qroovy hello.groovy

のようにすれば、groovy-all-1.8.7.jar がダウンロードされて、そのバージョンの Groovy で実行できます。

今後・・・


やっぱりマジメにやるには Cygwin + シェル・スクリプトをやった方がいいのかな?

追記


こちらで紹介されている GVM (Groovy enVironment Manager) の方がいいんじゃね?ということで。
プログラミングGROOVY

プログラミングGROOVY

*1:必要な Java ライブラリをダウンロードするライブラリ。

*2:Clojure 界の Maven 的存在。

*3:Windows のバッチファイルでも ftp コマンドとかでダウンロードできるのかな?

*4:zip アーカイブ中には、wget のインストーラがあったかも。 それでインストールしても大丈夫だと思います。

*5:これらの Jar ファイルは(特に設定しなければ)「USERPROFILE\.qroovy」フォルダ(たぶん「${user.home}/.qroovy」と同じ)にダウンロードされます。

*6:USERPROFILE の値は、たぶん Java での user.home プロパティの値と同じ。