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

Bos*_*osh 6 groovy dependencies classpath ruby-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()
Run Code Online (Sandbox Code Playgroud)

运行$ 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 
Run Code Online (Sandbox Code Playgroud)

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

tim*_*tes 10

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

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

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

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

@GrabConfig(systemClassLoader= true)
@Grab(group='xpp3', module='xpp3', version='1.1.3.4.O')
Run Code Online (Sandbox Code Playgroud)

而不是你现在拥有的一条线