saba1024のブログ

どうでも良い思いついた事とかプログラミング関係のメモとか書いていきます。

GroovyのGrape/Grabでdownload failedが発生する際の対処方法

Groovyでは、プログラムの実行時にMavenリポジトリから自動的に依存ライブラリのダウンロード、クラスパスの設定まで行ってくれるGrape/Grabという機能が有ります。 使い方自体は簡単で、コードの先頭に、

@Grab('org.apache.solr:solr-core:6.6.0')
@Grab('org.slf4j:slf4j-simple:1.7.12')
@Grab('commons-codec:commons-codec:1.10')

もしくは、

@Grapes([
    @Grab(group='commons-codec', module='commons-codec', version='1.10'),
    @Grab(group='org.slf4j', module='slf4j-simple', version='1.7.12', scope='test'),
    @Grab(group='org.apache.solr', module='solr-core', version='6.6.0')
])

のような指定をするだけです。
基本的にこれだけで問題ないのですが、時々以下のようなエラーに遭遇することが有ります。

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during conversion: Error grabbing Grapes -- [download failed: commons-codec#commons-codec;1.10!commons-codec.jar, download failed: org.slf4j#slf4j-api;1.7.7!slf4j-api.jar]

java.lang.RuntimeException: Error grabbing Grapes -- [download failed: commons-codec#commons-codec;1.10!commons-codec.jar, download failed: org.slf4j#slf4j-api;1.7.7!slf4j-api.jar]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
...Stacktraceが続く

ダウンロードが出来ない、ということなのですが、一体なぜなのか。。。
対処療法的ではありますが、手動でjarをダウンロードすることでこの問題を回避することが出来ます。
手動ダウンロードかよ。。。という話ではありますが、classpathを通さなくても良いのでGroovyConsoleなどから簡単にこれらの外部依存ライブラリを扱うことが出来る点は変わりありません。

標準だと、Grape/Grabでダウンロードされるjarファイル群は全て$HOME/.groovy/grapes配下に保存されます。
更にそのディレクトリから、グループ名/モジュール名 というディレクトリ構成になっています。
今回問題になっている、commons-codec1.10なので実際にそのディレクトリを見てみます。

[koji:~]$ cd $HOME/.groovy/grapes/commons-codec/commons-codec
[koji:commons-codec]$ ls -al
合計 40
drwxr-xr-x 3 koji koji  4096 Aug  2 14:47 .
drwxr-xr-x 3 koji koji  4096 Aug  2 14:34 ..
-rw-r--r-- 1 koji koji 10943 Jan  2  2017 ivy-1.10.xml
-rw-r--r-- 1 koji koji 11609 Jan  2  2017 ivy-1.10.xml.original
-rw-r--r-- 1 koji koji   873 Aug  2 14:39 ivydata-1.10.properties
[koji:commons-codec]$ 

何やらファイルが存在しています。
本来は、このディレクトリにjarsというディレクトリが有り、その中に実際のjarファイルが格納されています。(本来はGrape/Grabによってダウンロードされる)
それが存在していないので、手動でjarsを作って、Mavenリポジトリからjarを手動でダウンロードしてきます。

[koji:commons-codec]$ mkdir jars
[koji:commons-codec]$ wget http://central.maven.org/maven2/commons-codec/commons-codec/1.10/commons-codec-1.10.jar -P jars

これで完了です。 エラーになっていたGrape/Grabを使っているコードを再度実行すれば問題なく実行されるようになっています。