JasperReports 5.2 не работает с poi-3.7

Я использую JasperReports 5.2 с Apache poi 3.7 в папке lib сервера. У меня нет других версий poi в серверной библиотеке. Когда я пытаюсь создать отчет Excel, я получаю следующую ошибку.

java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFWorkbook.getCreationHelper()Lorg/apache/poi/ss/usermodel/CreationHelper;

Я вижу этот метод, доступный в этом файле jar, с помощью ссылки ниже.

http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/poi/3.7/org/apache/poi/hssf/usermodel/HSSFWorkbook.java?av=f


person Venu    schedule 15.10.2013    source источник
comment
Возможно, у вас есть несколько версий библиотеки poi в пути к классам. Возможно, ваше серверное приложение содержит другую версию этой библиотеки.   -  person Alex K    schedule 16.10.2013
comment
JasperReports API 5.2 использует org.apache.poi 3.7   -  person Alex K    schedule 16.10.2013
comment
@AlexK, у меня было старое содержимое банки с пои с другим именем банки в серверной библиотеке. Я удалил его, и теперь я не получаю никаких ошибок.   -  person Venu    schedule 16.10.2013
comment
Я уже разместил соответствующий ответ здесь   -  person Trideb Chapagai    schedule 27.06.2021
comment
Я уже разместил соответствующий ответ здесь, это было бы полезно для вас.   -  person Trideb Chapagai    schedule 27.06.2021
comment
Вы можете увидеть соответствующий ответ здесь, это было бы полезно.   -  person Trideb Chapagai    schedule 27.06.2021


Ответы (3)


Это достаточно распространенная проблема, поэтому в часто задаваемых вопросах Apache POI есть запись о ней, который даже включает код для определения того, что не так

По сути, где-то еще в вашем пути к классам (возможно, с вашего сервера) есть более старая копия Apache POI. Когда ваш код запускается, он вызывает загрузку класса, и ваш загрузчик классов бесполезно выбирает более старый jar, а не новый.

Если вы запустите код из FAQ:

ClassLoader classloader =
   org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource(
         "org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("Core POI came from " + path);

Затем это скажет вам, откуда загружается ядро ​​POI. Я могу практически гарантировать, что это будет не та банка, которую вы ожидаете... Уничтожьте старые банки POI (все!), тогда все будет готово.

Ну, в основном хорошо идти. Apache POI 3.7 исполнилось 3 года, поэтому было много исправления с тех пор, поэтому обновление стоит того!

person Gagravarr    schedule 16.10.2013
comment
На моем сервере есть файл jar с другим именем, но со старым содержимым poi jar. Я не осознавал этого, пока не набрал более четырех строк кода. Я удалил этот файл jar, и jasper 5.2 работает с poi 3.7. Благодарю вас ! - person Venu; 16.10.2013

Вы можете увидеть подходящую версию apache poi, просмотрев соответствующий репозиторий maven для Jasper.

Я оказался на Jasper 6.1:

http://repo2.maven.org/maven2/net/sf/jasperreports/jasperreports/6.1.0/jasperreports-6.1.0.pom

который указывает на apache poi 3.10.1.

Без совпадения версий вы, вероятно, столкнетесь со всевозможными странностями. Да, я придумал это слово.

person Blamkin86    schedule 07.12.2015

Я использую iReport 5.5.0 с банкой ниже...

poi-3.13.jar
jasperreports-5.0.4.jar
jackson-all-1.9.0.jar

и работает нормально...

person Mr. Mak    schedule 13.03.2018