JasperReports: java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser

JasperReports: java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser

我想与 JasperReports 分享一个或多或少常见错误的经验。

执行JasperReports制作PDF报表时出现异常:

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:667)
net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:983)

我的环境:

同样的问题:

我尝试了这些解决方案但没有成功。

所以这里要做一些检查:

  • 红帽知识库:https://access.redhat.com/solutions/1311113
    VMWare 知识库文章:https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2010240
    您的环境应该安装 X11 and/or 图形包(字体等)或者您必须 运行 Java 和 -Djava.awt.headless=true 选项。使用无头,您的库需要包含字体(默认 JasperReport 字体为 Pictonic.ttf)
  • 清理您的 Tomcat 缓存,不要进行热部署。某些 JasperReport 版本在某些 类 中使用 ThreadLocal 时存在内存泄漏。例如参见 [​​=14=]
  • JRStyledTextParser 有一个可以屏蔽一些异常的静态初始化器。它通过使用 java.awt 中的 Font 实现特别初始化缓存中字体的加载(在 OS 上或包含在 jar 中)。但是,查看 Font 的源代码:

    private static boolean hasTempPermission() {
    
    if (System.getSecurityManager() == null) {
        return true;
    }
    File f = null;
    boolean hasPerm = false;
    try {
        f = Files.createTempFile("+~JT", ".tmp").toFile();
        f.delete();
        f = null;
        hasPerm = true;
    } catch (Throwable t) {
        /* inc. any kind of SecurityException */
    }
    return hasPerm;
    }
    

Java 创建临时文件(如果已指定,请使用 java.io.tmp 选项)。因此,请检查您的临时文件夹是否已满且可由 Java PID 的 user/group 写入。如果不是的话,会抛出异常,但是被捕获,不可见...

我在我的开发机器上遇到了同样的问题。基本上是由于应用程序服务器 (Apache tomcat)

出现问题

基本上我不小心删除了服务器根目录中的“temp”文件夹。所以碧玉无法编译报告并继续生成报告。

临时文件夹 space 也会对报告生成过程造成巨大破坏。

所以检查服务器中的以下项目

  1. 服务器space
  2. tomcat 服务器中缺少文件夹

我在几个小时后找到了解决方案。如果您使用 bitnami docker 撰写文件,您必须对 java 文件夹进行卷。报告是 运行 java 1.8_201 版本。因此,您应该下载 1.8_201 并将其调整为您的 docker 撰写。

volumes:
  - 'jasperreports_data:/bitnami/jasperreports'
  - '/path/your/downloaded/java:/opt/bitnami/java'