加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy Antbuilder:如何在taskdef中使用Grape?

发布时间:2020-12-14 16:22:32 所属栏目:大数据 来源:网络整理
导读:这与.有关.我正在尝试使用Grape动态添加maven-ant-tasks jar,模拟这个: taskdef uri="antlib:org.apache.maven.artifact.ant" resource="org/apache/maven/artifact/ant/antlib.xml" classpathref="ant.classpath" / 我试过使用Grape.grab()来为AntBuilder
这与.有关.我正在尝试使用Grape动态添加maven-ant-tasks jar,模拟这个:

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

我试过使用Grape.grab()来为AntBuilder提供maven-ant-tasks,如下所示:

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将模块添加到与ANT引擎正在使用的不同的ClassLoader中.所以,我接受了this AntBuilder classpath question的建议,让Grape使用了根ClassLoader:

import groovy.grape.Grape

println "grab..."
Grape.grab(group:'ant',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)

有关使此工作的任何提示?或者,整个事情是个坏主意吗?

解决方法

我发现了这个: http://groovy.codehaus.org/Using+Ant+Libraries+with+AntBuilder

首先,将maven-ant-tasks放在根类加载器中:

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

或者,对于旧版本的Groovy:

Grape.grab(group: 'org.apache.maven',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')

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读