2009-10-29 6 views
7

Chciałem użyć groovy dla małego skryptu ftp i znalazłem ten post http://www.hhhhq.org/blog/2009/05/01/ftp-using-groovy-and-ant/ Ponieważ było kilka zależności, chciałem użyć Grape'a. Wszystkie zależności są rozwiązywane i obecne w pamięci podręcznej. Ale nie mogę zmusić Anta do znalezienia opcjonalnych zadań w innych bibliotekach. Zawsze mówiGroovy z problemem z klasą GrBo i 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 wersja: 1.6.5 JVM: 1.6.0_15

Oto mój kod źródłowy

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

Jak widać Podejrzewam classloader bycia problem , wydaje się, że Grape nie wstrzykuje tam zależności. Każdy pomysł, jak mogę go uruchomić?

Odpowiedz

7

Masz rację, podejrzewasz, że program ładujący klasy jest źródłem problemu. Jak już ujawnił twój kod, AntBuilder jest ładowany z RootLoadera, który nie ma dostępu do klas załadowanych adnotacją @Grab. Jak pokazuje GROOVY-3730, Groovy 1.7 rozwiąże ten problem.

można jednak rozwiązać problem bezpośrednio za pomocą metody groovy.grape.Grape.grab(Map dependency), w którym można ustawić konkretną classloader, który powinien być używany do załadowania zależności:

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

Cześć Chris, próbowałem swoje rozwiązanie i mam ten błąd: Caught: groovy.lang.MissingMethodException: Nie sygnatura metody: static groovy.lang.Grab.grab() ma zastosowanie do typów argumentów: (java.util.LinkedHashMap) wartości: [[grupa: org.codenarc, moduł: CodeNarc, wersja: 0.11, classLoader: org.codehaus .groovy.tools.RootLoader @ addbf1]] Możliwe rozwiązania: grep (java.lang.Object), wait(), dump(), any(), getAt (java.lang.String), wait (long) at CodeNarcTest.run (CodeNarcTest.groovy: 3). Jakieś pomysły? Używam groovy wersji 1.7.6 – Steven

+1

Hi Steven, wydaje się, że zamiast tego używasz typu adnotacji [groovy.lang.Grab] (http://groovy.codehaus.org/gapi/groovy/lang/Grab.html) klasy [groovy.grape.Grape] (http://groovy.codehaus.org/gapi/groovy/grape/Grape.html). Czy możesz to sprawdzić? –

+0

Ups, naprawiony. to chyba załatwiło sprawę. dzięki :-) – Steven

Powiązane problemy