Tomcat:JRStyledTextParser 未初始化。 java.awt 设置为真
Tomcat: JRStyledTextParser not Initialized. java.awt is set to true
我不断收到 java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
完整的堆栈跟踪是:
java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:108)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:69)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:57)
net.sf.jasperreports.engine.fill.JRFiller.createBandReportFiller(JRFiller.java:200)
net.sf.jasperreports.engine.fill.JRFiller.createReportFiller(JRFiller.java:215)
net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:115)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:583)
net.sf.jasperreports.engine.JasperRunManager.runToPdf(JasperRunManager.java:455)
net.sf.jasperreports.engine.JasperRunManager.runReportToPdf(JasperRunManager.java:870)
com.evnica.interop.main.ReportServlet.createReport(ReportServlet.java:119)
com.evnica.interop.main.ReportServlet.doGet(ReportServlet.java:96)
com.evnica.interop.main.ReportServlet.service(ReportServlet.java:79)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
我已经搜索了解决方案并找到了一堆。
- Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
- JasperReports NoClassDefFoundError exception on net.sf.jasperreports.engine.util.JRStyledTextParser
还有大约 10 个(这是我的第一个问题,所以我不能把它们都征集起来)。
我试过:
- 设置
java.awt.headless=true
。
我在代码中做到了:
static {
System.setProperty("java.awt.headless", "true");
System.out.println(java.awt.GraphicsEnvironment.isHeadless());
}
(returns 符合预期)。
我在 JVM 选项中做到了:
我将 CATALINA_OPTS 设置为 -Djava.awt.headless=true
。符合预期。
没用。
我用 DejaVu Sans 测试了它 with.jrxml 并在路径中包含了 jasperreports-fonts-6.2.2.jar,我用 Sans Serif 测试了它。我检查了 JVM 可以使用哪些字体并用它们进行了测试。没有成功。
有人建议检查 jasperreports 罐子的版本 - 我也检查过。我有 6.2.2 的所有罐子。版本:
jasperreports-6.2.2.jar,
jasperreports-fonts-6.2.2.jar,
jasperreports-javaflow-6.2.2.jar.
我使用 joda-time-2.9.3(不知道它与问题有什么关系,但一个建议是使用 joda;无论如何我从一开始就使用它),项目 SDK 是 java 1.8.0_51(有人建议更新到 8 - 不相关,因为我已经在使用它),我的 Tomcat 没问题(在其中一个案例中,缺少工作文件夹导致了类似的问题)。
我错过了什么?
编辑:
在调试时,我遇到了 JRGraphEnvInitializer class 中的方法 initializeGrophEnv(),它抛出一个 util.graphic.environment.initialization.error:
AVAILABLE_FONT_FACE_NAMES.addAll(Arrays.asList(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()));
有趣的是,SunGraphicsEnvironment 中的方法 getAvailableFontFamilyNames() returns 一个包含 274 个元素的有效数组(来自 link 下调试器的打印屏幕):
首先感谢大家的帮助。你回复的真快,让我深入挖掘=)问题解决了。
我的错误是库中同时包含 jasperreports-6.2.2.jar
和 jasperreports-javaflow-6.2.2.jar
。您还记得,堆栈跟踪中的最后一个方法是 JRBaseFiller
的初始化。两个 jar 的存在导致了冲突,因为它们都包含一个包 net.sf.jasperreports.engine.fill
,里面有一个 JRBaseFiller
class。
我只留下了jasperreports-javaflow-6.2.2.jar
。它没有单独工作。我又添加了两个库:jfreechart-1.0.19.jar
(以前的版本不包含所有需要的 classes)和 jcommon-1.0.8
。 java.lang.NoClassDefFoundError
不见了。
我不断收到 java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
完整的堆栈跟踪是:
java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:108)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:69)
net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:57)
net.sf.jasperreports.engine.fill.JRFiller.createBandReportFiller(JRFiller.java:200)
net.sf.jasperreports.engine.fill.JRFiller.createReportFiller(JRFiller.java:215)
net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:115)
net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:583)
net.sf.jasperreports.engine.JasperRunManager.runToPdf(JasperRunManager.java:455)
net.sf.jasperreports.engine.JasperRunManager.runReportToPdf(JasperRunManager.java:870)
com.evnica.interop.main.ReportServlet.createReport(ReportServlet.java:119)
com.evnica.interop.main.ReportServlet.doGet(ReportServlet.java:96)
com.evnica.interop.main.ReportServlet.service(ReportServlet.java:79)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
我已经搜索了解决方案并找到了一堆。
- Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
- JasperReports NoClassDefFoundError exception on net.sf.jasperreports.engine.util.JRStyledTextParser
还有大约 10 个(这是我的第一个问题,所以我不能把它们都征集起来)。
我试过:
- 设置
java.awt.headless=true
。
我在代码中做到了:
static {
System.setProperty("java.awt.headless", "true");
System.out.println(java.awt.GraphicsEnvironment.isHeadless());
}
(returns 符合预期)。
我在 JVM 选项中做到了:
我将 CATALINA_OPTS 设置为 -Djava.awt.headless=true
。符合预期。
没用。
我用 DejaVu Sans 测试了它 with.jrxml 并在路径中包含了 jasperreports-fonts-6.2.2.jar,我用 Sans Serif 测试了它。我检查了 JVM 可以使用哪些字体并用它们进行了测试。没有成功。
有人建议检查 jasperreports 罐子的版本 - 我也检查过。我有 6.2.2 的所有罐子。版本:
jasperreports-6.2.2.jar,
jasperreports-fonts-6.2.2.jar,
jasperreports-javaflow-6.2.2.jar.
我使用 joda-time-2.9.3(不知道它与问题有什么关系,但一个建议是使用 joda;无论如何我从一开始就使用它),项目 SDK 是 java 1.8.0_51(有人建议更新到 8 - 不相关,因为我已经在使用它),我的 Tomcat 没问题(在其中一个案例中,缺少工作文件夹导致了类似的问题)。
我错过了什么?
编辑: 在调试时,我遇到了 JRGraphEnvInitializer class 中的方法 initializeGrophEnv(),它抛出一个 util.graphic.environment.initialization.error:
AVAILABLE_FONT_FACE_NAMES.addAll(Arrays.asList(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()));
有趣的是,SunGraphicsEnvironment 中的方法 getAvailableFontFamilyNames() returns 一个包含 274 个元素的有效数组(来自 link 下调试器的打印屏幕):
首先感谢大家的帮助。你回复的真快,让我深入挖掘=)问题解决了。
我的错误是库中同时包含 jasperreports-6.2.2.jar
和 jasperreports-javaflow-6.2.2.jar
。您还记得,堆栈跟踪中的最后一个方法是 JRBaseFiller
的初始化。两个 jar 的存在导致了冲突,因为它们都包含一个包 net.sf.jasperreports.engine.fill
,里面有一个 JRBaseFiller
class。
我只留下了jasperreports-javaflow-6.2.2.jar
。它没有单独工作。我又添加了两个库:jfreechart-1.0.19.jar
(以前的版本不包含所有需要的 classes)和 jcommon-1.0.8
。 java.lang.NoClassDefFoundError
不见了。