【问题标题】:Missing resolveStrategy breaks DSL when executed from runnable jar从可运行 jar 执行时缺少 resolveStrategy 会破坏 DSL
【发布时间】:2019-01-11 10:27:56
【问题描述】:

我在我的一个 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

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

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

我正在使用带有 Java OpenJDK 1.8.0_192 的 Grails 3.3.8。

【问题讨论】:

    标签: java grails groovy jvm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 接口来自第三方库。它不在我的代码库中,并且在使用 gradle bootRun 时一切正常 - 它只是在我创建和运行创建的 jar 时崩溃。我可以/应该做什么?
      猜你喜欢
      • 2016-05-28
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2012-11-05
      相关资源
      最近更新 更多