2010-02-27 68 views
4

這與此有關。我試圖動態地添加與葡萄的Maven的螞蟻任務罈子裏,模擬這樣的: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") 

但是,這並不工作,因爲葡萄添加模塊從ANT引擎使用一個不同的類加載器。於是,我從this AntBuilder classpath question了意見,並作了葡萄用root的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

我們可以使用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); 
    } 
}