6

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失败

捕获: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 

...然后一切正常。

4

1 回答 1

10

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

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

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

要检查这一点,请尝试添加

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

而不是您当前拥有的一条线 Grab

于 2013-11-15T21:01:18.787 回答