我正在使用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 的执行时,我在单步执行 ClosureMetaClass
的 invokeMethod()
时发现了差异。
当工作版本中的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/