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

Missing resolveStrategy breaks DSL when executed from runnable jar

我在我的一个 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 的执行时,我在单步执行 ClosureMetaClassinvokeMethod() 时发现了差异。

当在工作版本中调用closure.getResolveStrategy();时,将返回Closure.DELEGATE_FIRST。调试 jar,结果会是 0 这样 MissingMethodException 之后会因为错误的 resolve 策略抛出。

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

is/could 这种行为的原因是什么? 我该怎么做才能解决这个问题?

我正在使用 Grails 3.3.8 和 Java OpenJDK 1.8.0_192.

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

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