使用@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 )