从可运行jar中执行时,缺少resolveStrategy会中断DSL

时间:2019-01-11 10:27:56

标签: java grails groovy jvm

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

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

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

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一起使用。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

@ClosureParams@DelegatesTo适用于groovy.lang.Closure类型的参数。在这种情况下,您已将其应用于Configurer<WorkbookDefinition>