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

标签 java grails groovy jvm

我正在使用Groovy Spreadsheet Builder在我的 Grails 项目之一中将一些数据导出为 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)接口(interface)如下所示:

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

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

此行为的原因是什么?可能是什么? 我该如何解决这个问题?

我使用 Grails 3.3.8 和 Java OpenJDK 1.8.0_192。

最佳答案

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

关于java - 当从可运行的 jar 执行时,缺少resolveStrategy会破坏DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54144645/

相关文章:

grails - 引起多对多关注

grails - 与namedQuery以多对多关系获取随机记录

groovy - Groovy 中的元对象协议(protocol) (MOP)

grails - 在Grails中批量更新记录

java - 生成 JAX-WS 源 NullPointerException

java - Java 扫描器是否实现了 Closeable?

java - jacoco-maven-plugin 中是否需要 prepare-agent 目标?

java - 如何为 SWT Scrolled Composite 设置启用水平滚动

grails - Multi-Tenancy 时如何使用DomainUnitTest进行测试

spring - Grails TransientObjectException