2009-10-29 10 views
7

Quería usar groovy para un pequeño script ftp y encontré esta publicación http://www.hhhhq.org/blog/2009/05/01/ftp-using-groovy-and-ant/ Dado que había varias dependencias, quería usar Grape. Todas las dependencias se resuelven y están presentes en el caché. Pero no puedo hacer que Ant encuentre las tareas opcionales en las otras librerías. Siempre diceGroovy con el problema del cargador de clases de Grape y 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) 

maravilloso Versión: 1.6.5 JVM: 1.6.0_15

Aquí está mi código fuente

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

Como se puede ver sospecho que el cargador de clases de causa de los problemas , parece que Grape no inyecta las dependencias allí. ¿Alguna idea de cómo puedo hacer que funcione?

Respuesta

7

Tiene razón al sospechar que el cargador de clases es la raíz del problema. Como su código ya revela, el AntBuilder se carga desde el RootLoader, que no tiene acceso a las clases cargadas por la anotación @Grab. Como muestra GROOVY-3730, Groovy 1.7 abordará este problema.

Sin embargo, puede resolver el problema utilizando directamente el método groovy.grape.Grape.grab(Map dependency), en la que se puede establecer un cargador de clase específica que se debe utilizar para cargar las dependencias:

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

Hola Chris, probé su solución y me sale este error: Atrapados: groovy.lang.MissingMethodException: No firma del método: static groovy.lang.Grab.grab() es aplicable para los tipos de argumento: (java.util.LinkedHashMap) values: [[group: org.codenarc, module: CodeNarc, version: 0.11, classLoader: org.codehaus .groovy.tools.RootLoader @ addbf1]] Posibles soluciones: grep (java.lang.Object), wait(), dump(), any(), getAt (java.lang.String), wait (long) at CodeNarcTest.run (CodeNarcTest.groovy: 3). ¿Algunas ideas? Estoy usando la versión de groovy 1.7.6 – Steven

+1

Hola Steven, parece que estás usando el tipo de anotación [groovy.lang.Grab] (http://groovy.codehaus.org/gapi/groovy/lang/Grab.html) de la clase [groovy.grape.Grape] (http://groovy.codehaus.org/gapi/groovy/grape/Grape.html). ¿Puedes verificar esto, por favor? –

+0

oops, arreglado. eso parecía haber hecho el truco. gracias :-) – Steven

Cuestiones relacionadas