Groovy类路径未由<groovy> Ant任务</groovy>正确设置

时间:2014-10-01 12:39:41

标签: ant groovy classpath

我的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]    ^

1 个答案:

答案 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>