2010-02-27 11 views
4

Ceci est en relation avec. Je suis en train d'ajouter dynamiquement les tâches maven-ant-pots avec de raisin, simulant ceci:Groovy + Antbuilder: Comment utiliser Grape avec taskdef?

<taskdef uri="antlib:org.apache.maven.artifact.ant" 
      resource="org/apache/maven/artifact/ant/antlib.xml" 
      classpathref="ant.classpath" /> 

J'ai essayé d'utiliser Grape.grab() pour rendre les tâches-maven-ant disponible pour AntBuilder comme celui-ci :

import groovy.grape.Grape 

println "grab..." 
Grape.grab(group:'ant', module:'ant', version:'1.7.0', classLoader:this.class.classLoader.rootLoader) 
Grape.grab(group: 'org.apache.maven', module: 'maven-ant-tasks', version: '2.0.9') 

println "ant taskdef..." 
def ant = new AntBuilder() 
ant.taskdef (resource: "org/apache/maven/artifact/ant/antlib.xml") 

mais cela ne fonctionne pas parce que les modules de raisin ajoute à un autre ClassLoader de celui qui moteur ANT utilise. Alors, je pris les conseils de this AntBuilder classpath question et MADE raisin utilise le ClassLoader racine:

import groovy.grape.Grape 

println "grab..." 
Grape.grab(group:'ant', module:'ant', version:'1.7.0', classLoader:this.class.classLoader.rootLoader) 
Grape.grab(group: 'org.apache.maven', module: 'maven-ant-tasks', version: '2.0.9', classLoader: this.class.classLoader.rootLoader) 

println "ant taskdef..." 
def ant = new AntBuilder() 
ant.taskdef (resource: "org/apache/maven/artifact/ant/antlib.xml") 

Maintenant, il jette un LinkageError:

Caught: : java.lang.LinkageError: loader constraint violation: when resolving overridden method "org.apache.tools.ant.helper.ProjectHelper2$RootHandler.setDocumentLocator(Lorg/xml/sax/Locator;)V" the class loader (instance of org/codehaus/groovy/tools/RootLoader) of the current class, org/apache/tools/ant/helper/ProjectHelper2$RootHandler, and its superclass loader (instance of <bootloader>), have different Class objects for the type org/xml/sax/Locator used in the signature 
at test.mavenanttasks.run(mavenanttasks.groovy:11) 

Tous les conseils sur l'obtention que cela fonctionne? Ou est-ce que le tout est une mauvaise idée?

Répondre

2

Je trouve ceci: http://groovy.codehaus.org/Using+Ant+Libraries+with+AntBuilder

D'abord, mettre maven-ant-tâches dans le classloader racine avec:

@Grapes([ 
@Grab(group = 'org.apache.maven', module = 'maven-ant-tasks', version = '2.1.3'), 
@GrabConfig(systemClassLoader = true) 
]) 

Sinon, pour les anciennes versions de Groovy:

Grape.grab(group: 'org.apache.maven', module: 'maven-ant-tasks', version: '2.1.3', classLoader: this.class.classLoader.rootLoader) 

Le Les tâches Maven ANT sont une 'AntLib', et elles peuvent être chargées comme ceci:

import groovy.xml.NamespaceBuilder 
def ant = new AntBuilder() 
def mvn = NamespaceBuilder.newInstance(ant, 'antlib:org.apache.maven.artifact.ant') 
1

Nous pouvons créer le chemin des fourmis (classpath) en utilisant java.net.URLClassLoader ou il est sous-classe par exemple:

<!-- language: groovy --> 
@Grapes([ 
    @Grab(group='org.jacoco', module='org.jacoco.ant', version= '0.7.4.201502262128'), 
    @Grab(group='org.jacoco', module='org.jacoco.core', version= '0.7.4.201502262128'), 
    @Grab('org.jacoco:org.jacoco.report:0.7.4.201502262128'), 
]) 
class Tool { 
    def dump(args){ 
     println "do dump...:$args" 
     println "DumpTask:"+org.jacoco.ant.DumpTask.classLoader; 
     def ant = new AntBuilder(); 
     def path1 = ant.path{ 
      org.jacoco.ant.DumpTask.classLoader.getURLs().each { 
       ant.pathelement(location:it.getFile()) 
      } 
     } 
     println "path11:$path1"; 

    // classname way 
    // ant.taskdef(name:"dump",classname:"org.jacoco.ant.DumpTask",classpath:path1); 
    // ant.dump(args); 

     //namespace way 
     ant.taskdef(uri:'antlib:org.jacoco.ant',resource:'org/jacoco/ant/antlib.xml',classpath:path1); 
     def jacoco=groovy.xml.NamespaceBuilder.newInstance(ant, 'antlib:org.jacoco.ant') 
     jacoco.dump(args); 
    } 
}