作成したGroovyスクリプトをGroovy未インストール環境で使ってもらう

2019-03-23Bash,Groovy

作成したGroovyスクリプトをチームメンバーに利用してもらいたいが、普通のメンバーはGroovyはインストールしていない。知名度はまだまだのようだ。

そこでGroovyをインストールしていないメンバー環境でもGroovyを実行できるようにするにはどうしたらよいかを試行錯誤してみた。

結果うまくいった方法を残しておく。

経緯

複数エクセルファイルの内容をまとめ、1ファイルにして提出する必要があった。これをGroovy + POIで実現しようとした。
Groovyスクリプトで難なくできたわけだがこれをほかメンバーに公開したい。

もちろん fat jar化 する方法もあるが、編集のたびにビルドするのが面倒なために今回は他の方法を検討。

実行環境

$ uname -vs
Linux #41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012

$ java -version
java version "1.7.0_03"
OpenJDK Runtime Environment (IcedTea7 2.1.1pre) (7~u3-2.1.1~pre1-1ubuntu3)
OpenJDK 64-Bit Server VM (build 22.0-b10, mixed mode)

$ groovy -version
Groovy Version: 2.0.0 JVM: 1.7.0_03 Vendor: Oracle Corporation OS: Linux

作成したスクリプト

実際のものと異なるが、 カネムーメモ: groovyとpoiでExcelファイルを出力する から拝借し一部変更したものを記載。

test.gr

#!/usr/bin/env groovy
@Grab("org.apache.poi:poi:3.8")
@Grab("org.apache.poi:poi-ooxml:3.8")
@Grab("org.apache.poi:poi-scratchpad:3.8")
import org.apache.poi.hssf.usermodel.*

def myVal = [
        ["あああ", "いいい", "ううう"],
        ["かかか", "ききき", "くくく"],
        ["さささ", "ししし", "すすす"]
]
def file = new File("test.xls")
file.withOutputStream {
    def book = new HSSFWorkbook()
    def sheet = book.createSheet()
    for (i in 0..<myVal.size) {
        //新規行作成
        HSSFRow row = sheet.createRow(i)
        for (j in 0..<myVal[i].size) {
            //新規セル作成
            HSSFCell cell = row.createCell((short) j)
            cell.with {
                encoding = HSSFCell.ENCODING_UTF_16
                setCellValue(myVal[i][j])
            }
        }
    }
    book.write it
}

poiのライブラリがなくても、Grape機能で自動的に依存性を解決してくれる。

Groovyのインストールされていない環境向けの設定

以下のように最低限必要なライブラリをプロジェクト配下に持ってくる。また、起動用バッチファイルを作成する。
作成するバッチファイルは以下のサイトを参照した。

# フォルダを作成し、Groovy動作に必要なライブラリをコピー
$ mkdir lib

$ cp $GROOVY_HOME/embeddable/groovy-all-2.0.0.jar lib/

$ cp $GROOVY_HOME/lib/ivy-2.2.0.jar lib/

$ tree
|~lib/
| |-groovy-all-2.0.0.jar
| `-ivy-2.2.0.jar
|-test.gr*

# 編集
$ vi test.bat

test.bat

ファイルに以下のコードを記述しておく。

set JAVA_OPTS=-Dgroovy.source.encoding=UTF-8 -Dfile.encoding=UTF-8
java %JAVA_OPTS% -cp &#34;./lib/groovy-all-2.0.0.jar;./lib/ivy-2.2.0.jar&#34; groovy.ui.GroovyMain test.gr
pause

実行

test.batをダブルクリックしたら普通にGrape走って関連ライブラリダウンロードしに行ってるぽい。

2019-03-23Bash,Groovy