我的Groovy脚本依赖于某些库。这就是我脚本顶部的内容。
@Grapes([
@Grab(group = 'net.sf.json-lib', module = 'json-lib', version = '2.3',
classifier = 'jdk15'),
@Grab(group = 'org.codehaus.groovy.modules.http-builder',
module = 'http-builder', version = '0.7.1'),
@Grab(group = 'commons-cli', module = 'commons-cli', version = '1.2')])
当我使用groovy
可执行文件从命令行运行脚本时,一切正常。人工制品下载并运行脚本。
但是,如果我尝试使用<groovy src="myscript.groovy" fork="true" />
(简化)从Apache Ant执行相同的脚本,那么人工制品也会得到解析和下载,但之后我会得到[groovy] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
。
Apache Ant安装使用我从我安装的Groovy安装中复制的groovy-all-2.3.6.jar
,因此它们应该完全相同。
我错过了什么?如何使<groovy>
任务正常工作并使用下载的jar?
更新我
我认为问题是Grape和Ant使用不同的类加载器,因此Ant无法看到工件。您可以尝试在@Grape注释后将@GrabConfig(systemClassLoader = true)添加到您的groovy脚本中吗?
如果我这样做,我会得到General error during conversion: No suitable ClassLoader found for grab
。
更新II
我现在也尝试了这个:
import groovy.grape.Grape;
Grape.grab(group:"commons-cli", module:"commons-cli", version:"1.2", classLoader:this.class.classLoader.rootLoader)
//...
没有用。我得到编译时错误:
[groovy] Exception in thread "main" Script Failed: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
[groovy] C:\Users\xxx\AppData\Local\Temp\embedded_script_in_2825216891785993632groovy_Ant_task: 18: unable to resolve class groovyx.net.http.HTTPBuilder
[groovy] @ line 18, column 1.
[groovy] import groovyx.net.http.HTTPBuilder
[groovy] ^
答案 0 :(得分:0)
摆脱@Grab并使用Grape提供的静态.grab()方法。它允许您指定Ant可以看到的rootLoader类加载器:
import groovy.grape.Grape;
Grape.grab(group:"commons-cli", module:"commons-cli", version:"1.2", classLoader:this.class.classLoader.rootLoader)
<repeat for rest of @Grab>