2009-10-29 64 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