最近我一直在与碧玉一起研究报告生成。我已经创建了一个简单的程序来测试它,当通过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选项-也没有改变任何东西,但曾经导致NullPointerException
在jasperreport
库中。用于测试程序-在两种情况下均有效 - 添加
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
-这会导致不同的错误,即NoSuchMethodError
为org.eclipse.jdt.internal.compiler.ICompilerRequestor
和其他一些错误。但是这个库应该不是必需的,因为据我所知,jasperreport-6.13.0.jar
已经包含了它的编译器,并且很长一段时间以来都不需要单独的编译器库。
尚未尝试的内容: - 强制加载类(http://www.java2s.com/Code/Java/Reflection/Forcethegivenclasstobeloadedfully.htm)
- 在运行时动态加载jar或使用自定义类加载器
**更新:在查看this答案并应用建议后,缺少的类是不同的。这表明jasperreport.jar
内部的依赖项没有正确加载
2条答案
按热度按时间eeq64g8w1#
我已经想明白了
由于某些原因,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
42fyovps2#
我遇到了同样的问题,我的项目执行(由碧玉库)Jasper Report。
在我的IDE和JBoss服务器上没有问题,但是当我在WildFly上部署时,问题出现了。
我只需要将jasper-compiler-jdt.jar添加到项目库中,最后就可以在WildFly上工作了。