embeddedのgroovy-all-1.6.3.jarだけではGrabできない?

@Grabアノテーションを使うためには、embedded/groovy-all-1.6.3.jarの他にlib/ivy-2.0.0.jarが必要な様です。単に固め漏れなのか、あるいはなにかライセンス絡みで入れられなかったのかもしれません。わかりませんが…


JFreeChartを試してみようといろいろしていたのですが、私が普段使っているJar Bundlerを使って作ったGroovy.appではGrabが動かなくてハマりました。
他にもいろいろハマりつつだったのですが、jfreechartと関係ないクラスが足りないと言われたので、早い段階で「embeddedのjarだけでは怪しいぞ」という見当はついて、まずは$GROOVY_HOME/bin/groovyConsoleから起動したGroovyConsoleで動く所まで作り込んだのが以下のスクリプトです。

import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import org.jfree.data.general.DatasetUtilities;
import javax.swing.JFrame;

@Grab(group='jfree', module='jfreechart', version='1.0.9')
def createLineChartFrame() {
    def chart = ChartFactory.createLineChart("test", "X軸", "Y軸",
            DatasetUtilities.createCategoryDataset("", "",
                    (double[][])[[1,2,3],[2,3,4],[4,6,5]]),
            PlotOrientation.VERTICAL,
            false, false, false)

    new ChartFrame("barChartFrame", chart)
}

createLineChartFrame().with {
    setSize(320, 240)
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setVisible(true);
}

とにかく@Grabアノテーションはクラスなりスクリプトクラスの特性として展開される何かなりに付けないと動かないらしいので、無理矢理関数を1個切ったりしています。
で、まぁこれでバッチ起動したGroovyConsoleからは動いたのですが、Groovy.appからは動かないのでした。
lib配下をすべてクラスパスに入れて動かしてみたりしたのですが、結局groovy-all-1.6.3.jar以外に必要だったのはivy-2.0.0.jarだけのようです。

  • embedded/groovy-all-1.6.3.jar
  • ivy-2.0.0.jar

の2つをGroovy.app内のContents/Resources/JavaにコピーしてClassPathを通してやると、上記スクリプトが無事動くようになりました。