Groovy:@Grab包含与classpath包含有什么不同?

时间:2013-11-15 20:26:32

标签: groovy dependencies classpath grape

1。一般来说,@ Grape / @ Grab包含与classpath包含有什么不同?

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:由:org.xmlpull.v1.XmlPullParserException引起:

但是,如果我手动将Grape提取的.jar添加到我的Groovy类路径

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

......然后一切正常。

1 个答案:

答案 0 :(得分:10)

Grab使用ivy从maven核心存储库中获取指定的库(以及所有依赖项)。然后,它将这些下载的库添加到运行当前脚本的加载器的类路径中。

将jar添加到类路径只是将指定的jar添加到系统类路径中。

由于此示例中没有依赖项,因此可能需要系统类加载器加载库。

要检查此项,请尝试添加

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

而不是你目前拥有的一行Grab