- В 2022 году я создал шаблон PDF с помощью JasperReports Studio (полагаю, это была версия 6.20) и успешно скомпилировал его. Скомпилированный файл .jasper отлично работал с моим существующим проектом Java, в котором используется старый набор библиотек JasperReports (в частности, jasperreports-2.0.4.jar и другие зависимости, перечисленные ниже). Старый шаблон по-прежнему работает нормально – я могу заполнить его и создать PDF-файлы без каких-либо ошибок.
- Недавно мне нужно было изменить шаблон. Я использовал ту же версию JasperReports Studio (насколько мне известно, все еще версию 6.20), чтобы открыть и перекомпилировать шаблон без внесения каких-либо изменений. Однако, когда я заменил старый файл .jasper новым скомпилированным в моем проекте, код начал выдавать ошибки (см. скриншот/трассировку стека ниже).
- Зависимости моего проекта (в стиле Maven, но с использованием системной области):
Версия JDK: 1.8
Код: Выделить всё
localjars1 ireportjars 1.0.1 system ${project.basedir}/lib/commons-digester-1.7.jar localjars2 ireportjars 1.0.2 system ${project.basedir}/lib/itext-1.2.3.jar localjars3 ireportjars 1.0.3 system ${project.basedir}/lib/iTextAsian.jar localjars4 ireportjars 1.0.4 system ${project.basedir}/lib/jasperreports-2.0.4.jar - Ошибка возникает во время выполнения, когда код Java пытается заполнить отчет. Вот трассировка стека (или сообщение об ошибке):
Код: Выделить всё
java.lang.NullPointerException: null
at net.sf.jasperreports.engine.JRPropertiesMap.readObject(JRPropertiesMap.java:185)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1185)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2345)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:2142)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1680)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2454)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2378)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2236)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1692)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:508)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:466)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:192)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:580)
at org.springblade.common.utils.PrintUtil.GenPDF(PrintUtil.java:186)
at org.springblade.common.utils.PrintUtil.TSGenDownPDF(PrintUtil.java:195)
at org.springblade.modules.tender.controller.TendProjectMaterialController.GenZBBytes(TendProjectMaterialController.java:2877)
at org.springblade.modules.tender.controller.TendProjectMaterialController.GenDownPDFOne(TendProjectMaterialController.java:2676)
at org.springblade.modules.tender.controller.TendProjectMaterialController$$FastClassBySpringCGLIB$$7a88e6a9.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
- Я убедился, что использую ту же версию JasperReports Studio, что и раньше (хотя я не уверен на 100 % в номере версии – возможно, это 6.20, но в проекте используются очень старые библиотеки).
- Я сравнил старую и новую .jasper и заметил различия (вероятно, из-за разных версий библиотеки JasperReports, используемых во время компиляции). Размер старого файла составляет около [размер] КБ, а нового — [размер] КБ.
- Я также подтвердил, что если я верну исходный файл .jasper (скомпилированный в 2022 году), все будет работать отлично. Таким образом, проблема определенно связана с недавно скомпилированной версией.
Исходный рабочий файл .jasper (тот, который по-прежнему заполняется правильно) доступен здесь:
https://drive.google.com/file/d/1uk-ZiA ... sp=sharing
Я прикрепил старый шаблон JRXML (тот, который работает) для справки. Ниже приведен фрагмент его ключевых свойств (например, языка, размера страницы, операторов импорта) — полный файл доступен [здесь, если я могу предоставить ссылку, или в виде вложения в сообщение, если поддерживается]. В шаблоне используются простые элементы, такие как текстовые поля и статический текст, и не используются какие-либо пользовательские сценарии или сложные выражения.
Мой вопрос:
Как я могу перекомпилировать шаблон JRXML, чтобы он оставался совместимым со старой библиотекой jasperreports-2.0.4.jar, используемой в моем проекте? Нужно ли мне настраивать JasperReports Studio для компиляции более старой версии JasperReports или мне следует рассмотреть возможность обновления зависимости JasperReports проекта? Если обновление является единственным решением, какая минимальная совместимая версия будет работать с JDK 8 и моими существующими зависимостями?
Буду очень признателен за любые рекомендации. Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/799 ... code-using