使用@Grab 注解编译 Groovy 项目时出错

Posted

技术标签:

【中文标题】使用@Grab 注解编译 Groovy 项目时出错【英文标题】:Error compiling a Groovy project using @Grab annotation 【发布时间】:2013-08-12 23:48:59 【问题描述】:

我正在使用 Gradle 编译一个 Groovy 项目,但我注意到当我在代码中使用 @Grab 注释时,出现以下错误:

$ gradle 编译 :buildInfo :compileJava UP-TO-DATE :compileGroovy 失败 FAILURE:构建失败并出现异常。 * 什么地方出了错: 任务 ':compileGroovy' 执行失败。 > org/apache/ivy/core/report/ResolveReport

(此处为完整堆栈跟踪http://pastebin.com/0ty4jNct)

我发现让它工作的唯一方法是将“groovy”和“ivy”模块添加到 groovy 类路径中,但我想避免这种情况,因为groovy 类路径已弃用。

这是 Gradle 错误吗?还是有更好的方法来管理 @Grab 依赖项?

【问题讨论】:

【参考方案1】:

@Grab 用于未预编译的独立脚本,您通常不会将它与已编译的代码一起使用。如果这样做,您可能需要将 Ivy 添加到 groovyClasspath。比如:

repositories 
    mavenCentral()


configurations 
    ivy


dependencies 
    ivy "org.apache.ivy:ivy:2.3.0"
    compile "org.codehaus.groovy:groovy-all:2.1.5"
  

tasks.withType(GroovyCompile) 
    groovyClasspath += configurations.ivy

也就是说,更好的方法是使用 Gradle 管理依赖项。

【讨论】:

嗨,我想你的意思是:configurations ivy 并在 dependencies 块中使用它,但它返回 Cannot infer Groovy class path because no Groovy Jar was found on class path: configuration ':compile' 对。当然,您必须声明一个 Groovy 依赖项。 是否有可能拥有一个既可以独立运行(使用@Grab)也可以在 Maven 上下文中运行的 Groovy“脚本”?【参考方案2】:

接受的解决方案在编译时对我有用,但在运行时我仍然遇到类似的问题。通过从编译中完全排除葡萄代码,以下对我有用:

compileGroovy 
  groovyOptions.configurationScript = file("gradle/config.groovy")

... 其中gradle/config.groovy 是一个单独的文件,其内容为:

withConfig(configuration) 
  configuration.setDisabledGlobalASTTransformations(['groovy.grape.GrabAnnotationTransformation'] as Set)

【讨论】:

以上是关于使用@Grab 注解编译 Groovy 项目时出错的主要内容,如果未能解决你的问题,请参考以下文章

Groovy编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )

Groovy编译时元编程 ( 编译时处理 ASTTransformation 接口实现 | 配置 ASTTransformation )

Groovy11_编译时元编程

Groovy11_编译时元编程

编译 Groovy 项目时更改 Gradle 的工作目录

Groovy学习笔记读取CSV文件