JasperReports 5.2 不适用于 poi-3.7
Posted
技术标签:
【中文标题】JasperReports 5.2 不适用于 poi-3.7【英文标题】:JasperReports 5.2 is not working with poi-3.7 【发布时间】:2013-10-23 20:27:13 【问题描述】:我在服务器 lib 文件夹中使用 JasperReports 5.2 和 Apache poi 3.7。我在服务器库中没有任何其他版本的 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
【问题讨论】:
可能你在类路径中有多个版本的 poi 库。可能是您的服务器应用程序包含此库的另一个版本 JasperReports API 5.2 正在使用 org.apache.poi 3.7 @AlexK,我在服务器库中有不同 jar 名称的旧 poi jar 内容。我删除了它,现在我没有收到任何错误。 我已经发布了相关答案here 我已经发布了一个相关的答案here,对你有帮助。 【参考方案1】:这是一个非常普遍的问题,the Apache POI FAQ has an entry for it,even includes code to work out what's wrong
基本上,在您的类路径的其他地方(可能来自您的服务器),有一个较旧的 Apache POI 副本。当您的代码运行时,它会触发类的加载,并且您的类加载器会毫无帮助地选择较旧的 jar,而不是较新的。
如果你run the code from the 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 is 3 years old 所以有很多fixes since then,值得考虑升级!
【讨论】:
我的服务器中有一个 jar 文件,名称不同,但 poi jar 内容旧。直到我运行了四行代码,我才意识到这一点。我删除了那个 jar 文件,jasper 5.2 正在使用 poi 3.7。谢谢!【参考方案2】:您可以通过检查 Jasper 的相关 maven 存储库来查看相应的 apache poi 版本。
我碰巧在 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。
如果版本不匹配,您可能会遇到各种奇怪的情况。是的,这个词是我编的。
【讨论】:
【参考方案3】:我正在使用 iReport 5.5.0 和下面的 jar ...
poi-3.13.jar
jasperreports-5.0.4.jar
jackson-all-1.9.0.jar
而且效果很好……
【讨论】:
以上是关于JasperReports 5.2 不适用于 poi-3.7的主要内容,如果未能解决你的问题,请参考以下文章
将作为整数输入的参数转换为 JasperReports 中的字符串