我在我的一个Grails项目中使用Groovy电子表格生成器将一些数据导出为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的执行过程中,我在遍历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兼容,但似乎可以解决问题。
@ClosureParams
和@DelegatesTo
适用于groovy.lang.Closure
类型的参数。在本例中,您已将其应用于Configurer<WorkbookDefinition>
。