【问题标题】:Tomcat: JRStyledTextParser not Initialized. java.awt is set to trueTomcat:JRStyledTextParser 未初始化。 java.awt 设置为真
【发布时间】:2016-05-26 21:34:40
【问题描述】:

我不断收到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)

我已经搜索了解决方案,找到了一堆。

还有大约 10 个(这是我的第一个问题,所以我不能全部列出)。

我试过了:

  1. 设置java.awt.headless=true

我是在代码中完成的:

 static {
    System.setProperty("java.awt.headless", "true");
    System.out.println(java.awt.GraphicsEnvironment.isHeadless());
 }

(按预期返回 true)。

我在 JVM 选项中做到了:

我将 CATALINA_OPTS 设置为 -Djava.awt.headless=true。正如预期的那样回响。

没用。

我用 .jrxml 和 DejaVu Sans 对其进行了测试,并在路径中包含了 jasperreports-fonts-6.2.2.jar,我用 Sans Serif 对其进行了测试。我检查了哪些字体可用于 JVM 并用它们进行测试。没有成功。

有人建议检查 jasperreports jar 的版本 - 我也检查过。我有 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 类中的一个方法 initializeGrophEnv(),它会抛出一个 util.graphic.environment.initialization.error:

AVAILABLE_FONT_FACE_NAMES.addAll(Arrays.asList(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()));

有趣的是,SunGraphicsEnvironment 中的 getAvailableFontFamilyNames() 方法返回了一个包含 274 个元素的有效数组(链接下调试器的打印屏幕):

【问题讨论】:

  • 您是否尝试调试代码(JasperReports API)?
  • @Alex K,是的,我做到了。它进入 JRGraphEnvInitialazer 类,public static synchronized void initializeGraphEnv(),并从 AVAILABLE_FONT_FACE_NAMES.addAll(Arrays.asList(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames())) 抛出异常;
  • 你能否在堆栈跟踪中添加“caused by:”,获取 Font.version 时为空指针?
  • 能否在JRStyledTextParser的静态块中也放一个断点?可能是您的字体扩展 jar 无法加载。您谈到了两个错误,JRBaseFiller.(JRBaseFiller.java:108) 的 JRStyledTextParser 的 NoClassDefFoundError 和 JRGraphEnvInitializer.initializeGraphEnv 的另一个错误?你要的是哪一个?
  • @PetterFriberg,很抱歉造成误解。我最初提供的是根本原因。抛出的异常是 javax.servlet.ServletException:Servlet 执行抛出异常 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter .java:71) 接下来是我上面提供的根本原因。因此,net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:108) 是堆栈跟踪中我无需调试即可看到的最深级别。

标签: java jasper-reports servlet-3.0


【解决方案1】:

首先感谢大家的帮助。你反应这么快,让我更深入地挖掘=)问题解决了。

我的错误是库中有jasperreports-6.2.2.jarjasperreports-javaflow-6.2.2.jar。你还记得,堆栈跟踪中的最后一个方法是初始化JRBaseFiller。两个 jar 的存在导致了冲突,因为它们都包含一个包 net.sf.jasperreports.engine.fill,其中包含一个 JRBaseFiller 类。

我只留下了jasperreports-javaflow-6.2.2.jar。它自己不起作用。我又添加了两个库:jfreechart-1.0.19.jar(以前的版本没有包含所有需要的类)和jcommon-1.0.8java.lang.NoClassDefFoundError 不见了。

【讨论】:

    猜你喜欢
    • 2016-11-29
    • 2022-08-17
    • 2019-09-02
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多