読者です 読者をやめる 読者になる 読者になる

GroovyでXML-RPCを使う

以前、GroovyでXMLRPC経由でConfluenceのAPIにアクセスする方法について、以下のエントリを書きました。その際はXMLRPCのライブラリ追加方法には触れませんでしたが、GROOVY_HOMEのlibにjarを放り込んでいました。今回、Grapeという依存ライブラリ管理ツールを使う方法について書いておきます。
XML-RPCで添付ファイルを追加する
Grapeを使うとgroovyのソースコードアノテーションを使って依存ライブラリを記述することができ、実行時に自動でライブラリがダウンロードされます。
XMLRPCを使う場合には、importに以下のようにアノテーションを付加します。

@Grab(group='org.codehaus.groovy', module='groovy-xmlrpc', version='0.7')
import groovy.net.xmlrpc.*;

ただ、これだとsmackというライブラリが足りずエラーとなります。Mavenのセントラルリポジトリには3.0.1というバージョンはありません...うーむ。

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during conversion: Error grabbing Grapes -- [unresolved dependency: jivesoftware#smack;3.0.1: not found]

結果的には以下のようにGrapeのアノテーションを付加すれば無事動作しました。

@Grab(group='org.codehaus.groovy', module='groovy-xmlrpc', version='0.7')
@Grab(group='jivesoftware', module='smack', version='3.0.4')
import groovy.net.xmlrpc.*;

xmlrpcとsmackのアノテーションが逆になっていると、java.lang.ExceptionInInitializerErrorが発生します。はじめてGrapeを使ったので、この例外だけだとどこが悪いのかわかりません。
また、Grapeの日本語ドキュメントは古いのか誤字なのか、ここの複数のアノテーションの書き方ではコンパイルエラーになります。上記のように複数@Grabアノテーションを付けるか、@Grabの配列を渡します。

@Grapes([
    @Grab(group='commons-primitives', module='commons-primitives', version='1.0'),
    @Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='0.9.7')])