gpt4 book ai didi

Groovy 与 Grape 和 AntBuilder 类加载器问题

转载 作者:行者123 更新时间:2023-12-04 12:01:46 24 4
gpt4 key购买 nike

我想用 groovy 做一个小 ftp 脚本,发现这篇文章 http://www.hhhhq.org/blog/2009/05/01/ftp-using-groovy-and-ant/
由于有几个依赖项,我想使用 Grape。所有依赖项都已解决并存在于缓存中。但是我无法让 Ant 在其他库中找到可选任务。
它总是说

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)

Groovy 版本:1.6.5 JVM:1.6.0_15

这是我的源代码
@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()

如您所见,我怀疑类加载器是问题所在,似乎
Grape 不会在那里注入(inject)依赖项。
知道如何让它工作吗?

最佳答案

您正确地怀疑类加载器是问题的根源。正如您的代码已经显示的那样,AntBuilder 是从 RootLoader 加载的,它无法访问 @Grab 注释加载的类。如GROOVY-3730表明,Groovy 1.7 将解决这个问题。

但是,您可以直接使用 groovy.grape.Grape.grab(Map dependency) 来解决您的问题。方法,您可以在其中设置应用于加载依赖项的特定类加载器:

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)

关于Groovy 与 Grape 和 AntBuilder 类加载器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com