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
を使っているコードを再度実行すれば問題なく実行されるようになっています。