最近我一直在使用Jasper进行报告生成。我创建了一个简单的程序来测试它,当通过IDE运行它时,它确实运行得很好。
然后,我将(非常短的(类移到了WildFly服务器应用程序中,尽管有完全相同的代码和库,但cannot find symbol
的生成失败了。它找不到的符号是JREvaluator
、JRFillVariable
以及net.sf.jasperreports.engine
等包
到目前为止,我已经确认:
- 项目构建(意味着这些类对javac可见,但对jvm不可见(
jasperreports-6.13.0.jar
被添加到war
中(它与其他库(如gson
和hibernate
(一起存在于/WEB-INF/lib
文件夹中jasperreports-6.13.0.jar
包含缺失的类
在我看来,问题不在于库没有加载或缺少类(因为在测试环境中它是有效的(,而在于有什么东西阻止JBoss类加载器加载那些类
尝试(和失败(的解决方案
-
清理并构建
-
将
-Djava.awt.headless=true
添加到VM选项中-这并没有改变任何 -
将
-Djava.awt.headless=false
添加到VM选项-也没有改变任何事情,但曾经导致jasperreport
库中的NullPointerException
。对于测试程序-在两种情况下都有效 -
添加
commons-beanutils-1.9.4.jar
、commons-digester-2.1.jar
、commons-collections4-4.4.jar
和commons-loggin-1.2.jar
,不变 -
添加
jasper-compiler-jdt-5.5.23.jar
-这导致了不同的错误,即org.eclipse.jdt.internal.compiler.ICompilerRequestor
的NoSuchMethodError
和其他一些错误。然而,这个库不应该是必要的,因为据我所知,jasperreport-6.13.0.jar
已经包含了它的编译器,而且很长一段时间以来都不需要单独的编译器库。
尚未尝试的内容:
- 强制加载类(http://www.java2s.com/Code/Java/Reflection/Forcethegivenclasstobeloadedfully.htm)
- 在运行时动态加载jar或使用自定义类加载器
更新:看了这个答案并应用了建议后,缺少的类就不一样了。这表明jasperreport.jar
内部的依赖项没有正确加载
我已经算出了
由于某种原因,jasperreport.jar在服务器项目中使用的库没有加载,但在测试项目中加载了(可能是由于WildFly,可能是由于IntelliJ和NetBeans之间的差异(
以下是库列表,基于我添加的jasperreport.jar中的pom.xml
文件。有些可能不必要,列表可能也不详尽(一旦报告开始生成,我基本上就不再添加库了(,但如果其他人遇到这个问题,它就足够了:
commons-beanutils-1.9.4.jar
itext-2.1.7.jar
poi-ooxml-4.1.1.jar
commons-collections4-4.4.jar
jcommon-1.0.23.jar
xalan-2.7.2.jar
commons-digester-2.1.jar
jfreechart-1.0.19.jar
xmpcore-5.1.3.jar
commons-logging-1.2.jar
poi-4.1.1.jar
我也遇到了同样的问题,我的项目(通过jasper库(执行了一个jasper Report。
在我的IDE和JBoss服务器上,a没有问题,但当我通过WildFly部署时,问题出现了。
我只需要将jasper编译器jdt.jar添加到项目库中,最后就可以使用WildFly了。