1. ホーム
  2. groovy

[解決済み] グルービーです。Grabインクルージョンとクラスパスインクルージョンの違いは?

2022-02-16 19:29:23

質問

1. 一般的に、@Grape/@Grab のインクルージョンとクラスパスのインクルージョンはどのように違うのでしょうか?

2. 具体的には、以下のような動作の違いが生じると思われますが、どのようなことが考えられますか?

の要件があるんだけど xpp3 と表現しています。

// TestScript.groovy
@Grab(group='xpp3', module='xpp3', version='1.1.3.4.O')
import org.xmlpull.v1.XmlPullParserFactory;
println "Created: " + XmlPullParserFactory.newInstance()

実行中 $ groovy TestScript.groovy で失敗します。

Caught: org.xmlpull.v1.XmlPullParserException: 原因は次のとおりです。

しかし、もし私が Grapeによって取得された.jarをGroovyのクラスパスに手動で追加します。 :

$ groovy -cp ~/.groovy/grapes/xpp3/xpp3/jars/xpp3-1.1.3.4.O.jar \
         TestScript.groovy 

...すると、すべてがうまくいきます。

解決方法は?

Grab は ivy を使用して、指定されたライブラリ(およびその依存関係のすべて)を maven コアリポジトリから取得します。そして、これらのダウンロードされたライブラリを、現在のスクリプトを実行しているローダーのクラスパスに追加します。

クラスパスへの jar の追加は、指定された jar をシステムのクラスパスに追加するだけです。

この例では依存関係がないので、おそらくライブラリがシステムのクラスローダーによってロードされる必要があることが要求されているのでしょう。

これを確認するために

@GrabConfig(systemClassLoader= true)
@Grab(group='xpp3', module='xpp3', version='1.1.3.4.O')

現在、1行のGrabの代わりに