从可运行的 jar 执行时,缺少 resolveStrategy 会破坏 DSL
Missing resolveStrategy breaks DSL when executed from runnable jar
我在我的一个 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 的执行时,我在单步执行 ClosureMetaClass
的 invokeMethod()
时发现了差异。
当在工作版本中调用closure.getResolveStrategy();
时,将返回Closure.DELEGATE_FIRST
。调试 jar,结果会是 0
这样 MissingMethodException
之后会因为错误的 resolve 策略抛出。
目前我不知道如何解决这个问题。
is/could 这种行为的原因是什么?
我该怎么做才能解决这个问题?
我正在使用 Grails 3.3.8 和 Java OpenJDK 1.8.0_192.
@ClosureParams
和@DelegatesTo
适用于groovy.lang.Closure
类型的参数。在这种情况下,您已将其应用于 Configurer<WorkbookDefinition>
.
如果您不需要支持 JDK 7,您可以升级到 Groovy Spreadsheet Builder 2.0.0.RC1,它只兼容 JDK 8,但似乎可以解决问题。
我在我的一个 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 的执行时,我在单步执行 ClosureMetaClass
的 invokeMethod()
时发现了差异。
当在工作版本中调用closure.getResolveStrategy();
时,将返回Closure.DELEGATE_FIRST
。调试 jar,结果会是 0
这样 MissingMethodException
之后会因为错误的 resolve 策略抛出。
目前我不知道如何解决这个问题。
is/could 这种行为的原因是什么? 我该怎么做才能解决这个问题?
我正在使用 Grails 3.3.8 和 Java OpenJDK 1.8.0_192.
@ClosureParams
和@DelegatesTo
适用于groovy.lang.Closure
类型的参数。在这种情况下,您已将其应用于 Configurer<WorkbookDefinition>
.
如果您不需要支持 JDK 7,您可以升级到 Groovy Spreadsheet Builder 2.0.0.RC1,它只兼容 JDK 8,但似乎可以解决问题。