从可运行 jar 执行时缺少 resolveStrategy 会破坏 DSL

我在我的一个 Grails 项目中使用 Groovy Spreadsheet Builder将一些数据导出为 Excel 文件。


gradle assemble在我创建一个可运行的 jar(使用)并使用它之前,一切都很好。


我在这样的服务中使用构建器:


class ExcelService {

    ...

    void export(OutputStream outputStream) {

       ...

       PoiSpreadsheetBuilder.create(outputStream).build {

          apply ExcelStylesheet

          ...

       } 

    }

    ...

}

当我尝试从使用生成的 jar 开始的应用程序中导出数据时,我将得到以下信息MissingMethodException:


groovy.lang.MissingMethodException: No signature of method: my.package.ExcelService.apply() is applicable for argument types: (java.lang.Class)

SpreadsheetBuilder 的 (Java) 接口如下所示:


public interface SpreadsheetBuilder {

  void build(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = WorkbookDefinition.class) @ClosureParams(value = FromString.class, options = "builders.dsl.spreadsheet.builder.api.WorkbookDefinition") Configurer<WorkbookDefinition> workbookDefinition);

}

在调试代码和 jar 的执行时,我在单步invokeMethod()执行ClosureMetaClass.


在closure.getResolveStrategy();工作版本中调用Closure.DELEGATE_FIRST时将返回。调试jar,结果会0因为MissingMethodException解析策略错误而导致稍后抛出。


目前我不知道如何解决这个问题。


这种行为的原因是/可能是什么?我能做些什么来解决这个问题?


我将 Grails 3.3.8 与 Java OpenJDK 1.8.0_192 一起使用。


交互式爱情
浏览 173回答 2
2回答

弑天下

如果您不需要支持 JDK 7,您可以升级到 Groovy Spreadsheet Builder 2.0.0.RC1,它只兼容 JDK 8,但似乎可以解决问题。

30秒到达战场

@ClosureParams并且@DelegatesTo适用于 type 的参数groovy.lang.Closure。在这种情况下,您已将其应用于Configurer<WorkbookDefinition>.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java