2010-02-27 2 views
4

Это связано с. Я пытаюсь динамически добавлять Maven-ANT-задачи банки с виноградом, имитируя это:Groovy + Antbuilder: как использовать Grape для работы с taskdef?

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

Я пытался использовать Grape.grab(), чтобы сделать Maven-муравей-задачу, доступной для AntBuilder, как это :

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") 

, но это не работает, потому что Grape добавляет модули к другому ClassLoader от той, что АНТ двигатель использует. Итак, я взял совет от this AntBuilder classpath question и сделал Grape использовать корень ClassLoader:

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") 

Теперь бросает 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) 

Любые намеки на получение этой работы? Или, все это плохая идея?

ответ

2

Я нашел это: http://groovy.codehaus.org/Using+Ant+Libraries+with+AntBuilder

Во-первых, поставить Maven муравей-задачи в корне загрузчиком классов с:

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

В качестве альтернативы, для более старых версий Groovy:

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

В Задачи Maven ANT - это «AntLib», и их можно загружать следующим образом:

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

Мы можем создать муравья путь (CLASSPATH), используя java.net.URLClassLoader или это подкласс например:

<!-- 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); 
    } 
} 
Смежные вопросы