【问题标题】:Groovy: How does @Grab inclusion differ from classpath inclusion?Groovy:@Grab 包含与类路径包含有何不同?
【发布时间】:2013-11-15 20:26:31
【问题描述】:

1。一般来说,@Grape/@Grab 包含与类路径包含有何不同?

2。具体来说,什么可能导致以下行为差异?

我对@9​​87654321@ 有一个要求,我表示为:

// 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 

...然后一切正常。

【问题讨论】:

    标签: groovy dependencies classpath groovy-grape


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 这修复了我的示例(非常感谢!)但在现实世界中,xpp3 对我来说是一个传递依赖。如果我将systemClassLoader= true 添加到传递到xpp3 的Grab,我会收到一个链接错误(loader constraint violation: when resolving overridden method "org.apache.xerces.jaxp.SAXParserImpl.getXMLReader()Lorg/xml/sax/XMLReader;)。关于这个的想法?
    • Grab 仅此而已,我会转向像 gradle 这样的构建工具
    • 嗯,好的。我只想运行一个 groovy 脚本,它需要一个 mvn 可访问的 jar 及其传递依赖项。 (这在 grails-land 中运行良好......)您会为此推荐 gradle 吗?
    • 不,如果它只是一个脚本(没有提到你在做什么或你试图在问题中加载什么库)。如果 Grab 不起作用,您需要自己将它们添加到类路径中,如问题中所示。
    • 感谢您的建议!这只是一个脚本,但我想以一种用户可以自己执行该脚本的方式分发它,而不必先手动下载一堆 jar。 @Grab 会很棒。照原样,我正在使用类似于 stackoverflow.com/questions/17360719/… 的基于 Gradle 的解决方案——它工作正常,但我很想知道您是否认为有更好的方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2012-03-10
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多