【问题标题】:Groovy with Grape and AntBuilder classloader problemGroovy 与 Grape 和 AntBuilder 类加载器问题
【发布时间】:2009-10-29 01:15:07
【问题描述】:

我想用 groovy 做一个小 ftp 脚本,发现这篇文章 http://www.hhhhq.org/blog/2009/05/01/ftp-using-groovy-and-ant/ 由于有几个依赖项,我想使用 Grape。所有依赖项都已解决并存在于缓存中。但是我无法让 Ant 在其他库中找到可选任务。 它总是说

Caught: : Problem: failed to create task or type ftp
Cause: the class org.apache.tools.ant.taskdefs.optional.net.FTP was not found.
        This looks like one of Ant's optional components.
Action: Check that the appropriate optional JAR exists in
        -ANT_HOME\lib
        -the IDE Ant configuration dialogs

Do not panic, this is a common problem.
The commonest cause is a missing JAR.

This is not a bug; it is a configuration problem

        at GrabTest.runMe(GrabTest.groovy:15)
        at GrabTest.run(GrabTest.groovy:26)

Groovy 版本:1.6.5 JVM:1.6.0_15

这是我的源代码

@Grab(group='ant', module='ant', version='[1.6.5,)')
@Grab(group='ant', module='ant-nodeps', version='[1.0,)')
@Grab(group='ant', module='ant-apache-oro', version='[1.0,)') 
@Grab(group='ant', module='ant-commons-net', version='[1.0,)') 
@Grab(group='apache-oro', module='jakarta-oro', version='[2.0.8,)')
@Grab(group='commons-net', module='commons-net', version='[1.4,)')
def runMe() {
    // works
    println getClass().getClassLoader().loadClass("org.apache.tools.ant.taskdefs.optional.net.FTP")

    def ant = new AntBuilder()

    println getClass().getClassLoader() //groovy.lang.GroovyClassLoader$InnerLoader
    println ant.getClass().getClassLoader() //org.codehaus.groovy.tools.RootLoader
    ant.ftp( server:"ftp.foo.com",
            userid:"user",
            password:"passwd",
            passive:"yes",
            verbose:"yes",
            remotedir:"/pub/incoming",
            binary:"yes" ) {
                fileset( dir:"." ) { include( name:"**/*.gz" ) }
            }
}

runMe()

如您所见,我怀疑类加载器是问题所在,似乎 Grape 不会在那里注入依赖项。 知道如何让它工作吗?

【问题讨论】:

    标签: groovy ant ftp classloader groovy-grape


    【解决方案1】:

    您怀疑类加载器是问题的根源是正确的。正如您的代码已经显示的那样,AntBuilder 是从 RootLoader 加载的,它无法访问 @Grab 注释加载的类。正如GROOVY-3730 所示,Groovy 1.7 将解决这个问题。

    但是,您可以直接使用groovy.grape.Grape.grab(Map dependency) 方法来解决您的问题,在该方法中您可以设置一个特定的类加载器,该类加载器应该用于加载依赖项:

    import groovy.grape.Grape;
    
    Grape.grab(group:'ant', module:'ant', version:'1.6.5', classLoader:this.class.classLoader.rootLoader)
    Grape.grab(group:'ant', module:'ant-nodeps', version:'1.6.5', classLoader:this.class.classLoader.rootLoader)
    Grape.grab(group:'ant', module:'ant-apache-oro', version:'1.6.5', classLoader:this.class.classLoader.rootLoader)
    Grape.grab(group:'ant', module:'ant-commons-net', version:'1.6.5', classLoader:this.class.classLoader.rootLoader)
    Grape.grab(group:'commons-net', module:'commons-net', version:'1.4.1', classLoader:this.class.classLoader.rootLoader)
    Grape.grab(group:'oro', module:'oro', version:'2.0.8', classLoader:this.class.classLoader.rootLoader)
    

    【讨论】:

    • 嗨,克里斯,我尝试了您的解决方案,但出现此错误:捕获:groovy.lang.MissingMethodException:没有方法签名:静态 groovy.lang.Grab.grab() 适用于参数类型: (java.util.LinkedHashMap) values: [[group:org.codenarc, module:CodeNarc, version:0.11, classLoader:org.codehaus.groovy.tools.RootLoader@addbf1]] 可能的解决方案:grep(java.lang.Object )、wait()、dump()、any()、getAt(java.lang.String)、在 CodeNarcTest.run(CodeNarcTest.groovy:3) 处等待(long)。有任何想法吗?我正在使用 groovy 版本 1.7.6
    • 嗨 Steven,您似乎使用的是 groovy.lang.Grab 注释类型而不是 groovy.grape.Grape 类。请检查一下好吗?
    【解决方案2】:

    或者只是简单地使用

    @GrabConfig(systemClassLoader=true)
    

    可以找到更多信息:http://groovy.codehaus.org/Grape

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 2020-07-23
      • 2011-12-05
      相关资源
      最近更新 更多