2009-10-29 61 views
7

我想使用groovy为一个小小的ftp脚本,并发现这篇文章http://www.hhhhq.org/blog/2009/05/01/ftp-using-groovy-and-ant/ 由于有几个依赖我想用葡萄。所有依赖关系都已解析并存在于缓存中。但我无法让Ant在其他库中找到可选任务。 它总是说Groovy与葡萄和AntBuilder类加载器问题

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() 

正如你可以看到我怀疑是问题的类加载器,似乎 葡萄不会在那里注入依赖关系。 任何想法,我如何才能使其工作?

回答

7

你是对的怀疑classloader是问题的根源。正如你的代码已经显示的那样,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) 
+0

嗨克里斯,我想你的解决方案,我得到这个错误:夹缝:groovy.lang.MissingMethodException:无方法的签名:static 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),wait(long) at CodeNarcTest.run(CodeNarcTest.groovy:3)。有任何想法吗?我正在使用groovy版本1.7.6 – Steven 2011-01-24 02:35:25

+1

嗨史蒂文,看来你正在使用[groovy.lang.Grab](http://groovy.codehaus.org/gapi/groovy/lang/Grab.html)注释类型[groovy.grape.Grape](http://groovy.codehaus.org/gapi/groovy/grape/Grape.html)类。你能检查一下吗? – 2011-01-24 13:55:07

+0

哎呀,固定。这似乎已经成功了。谢谢:-) – Steven 2011-01-24 22:23:17

0

或者只是简单地使用

@GrabConfig(systemClassLoader=true) 

更多信息,可以发现:http://groovy.codehaus.org/Grape

+0

这很长时间不工作。 – shybovycha 2013-09-23 14:26:07

+0

对我而言,它每天都在工作。 – takacsot 2013-09-24 18:02:22

+0

我做错了什么? =) – shybovycha 2013-09-24 18:05:25