【发布时间】: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。
【问题讨论】: