Я использую Groovy Spreadsheet Builder в одном из моих проектов Grails для экспорта некоторых данных в файл Excel.
Все прекрасно работает, пока я не создаю работающую флягу (используя 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)
Интерфейс (Java) SpreadsheetBuilder выглядит следующим образом:
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);
}
При отладке выполнения кода и фляги я обнаружил разницу при переходе по invokeMethod()
из ClosureMetaClass
.
Когда closure.getResolveStrategy();
в рабочей версии вызывается, Closure.DELEGATE_FIRST
будет возвращено. Отладка банки приведет к 0
, поэтому MissingMethodException
будет брошено позже из-за неправильной стратегии разрешения.
Пока я понятия не имею, как решить эту проблему.
В чем / может быть причина такого поведения?
Что я могу сделать, чтобы решить эту проблему?
Я использую Grails 3.3.8 с Java OpenJDK 1.8.0_192.