2009-10-29 7 views
7

Je voulais utiliser groovy pour un petit script ftp et trouvé ce poste http://www.hhhhq.org/blog/2009/05/01/ftp-using-groovy-and-ant/ Puisqu'il y avait plusieurs dépendances je voulais utiliser Grape. Toutes les dépendances sont résolues et présentes dans le cache. Mais je ne peux pas obtenir Ant pour trouver les tâches optionnelles dans les autres bibliothèques. Il dit toujoursGroovy avec Grape et problème de chargeur de classe 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) 

Version Groovy: 1.6.5 JVM: 1.6.0_15

Voici mon code source

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

Comme vous pouvez le voir, je soupçonne le classloader d'être le problème , il semble que Grape n'injecte pas les dépendances là. Une idée de comment je peux le faire fonctionner?

Répondre

7

Vous avez raison de penser que le classloader est à l'origine du problème. Comme votre code l'indique déjà, AntBuilder est chargé à partir du RootLoader, qui n'a pas accès aux classes chargées par l'annotation @Grab. Comme le montre GROOVY-3730, Groovy 1.7 va résoudre ce problème.

Cependant, vous pouvez résoudre votre problème en utilisant directement la méthode groovy.grape.Grape.grab(Map dependency), dans laquelle vous pouvez définir un Classloader spécifique qui doit être utilisé pour charger les dépendances:

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

Salut Chris, j'ai essayé votre solution et je reçois cette erreur: Pris: groovy.lang.MissingMethodException: Non signature de la méthode: static groovy.lang.Grab.grab() est applicable pour les types d'arguments: (java.util.LinkedHashMap) valeurs: [[groupe: org.codenarc, module: CodeNarc, version: 0.11, classLoader: org.codehaus .groovy.tools.RootLoader @ addbf1]] Solutions possibles: grep (java.lang.Object), wait(), dump(), any(), getAt (java.lang.String), wait (long) à CodeNarcTest.run (CodeNarcTest.groovy: 3). Des idées? J'utilise groovy version 1.7.6 – Steven

+1

Salut Steven, il semble que vous utilisiez plutôt le type d'annotation [groovy.lang.Grab] (http://groovy.codehaus.org/gapi/groovy/lang/Grab.html) de la classe [groovy.grape.Grape] (http://groovy.codehaus.org/gapi/groovy/grape/Grape.html). Pouvez-vous vérifier cela, s'il vous plaît? –

+0

oups, corrigés. cela semblait avoir fait l'affaire. merci :-) – Steven