【问题标题】:JasperReports: java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParserJasperReports:java.lang.NoClassDefFoundError:无法初始化类 net.sf.jasperreports.engine.util.JRStyledTextParser
【发布时间】:2017-08-24 02:43:25
【问题描述】:

我想与 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)

我的环境:

  • CentOs 6.6 - 内核 2.6.32-504.el6.x86_64
  • Java 1.7_79(太阳)
  • JasperReport 6.2.2
  • Apache Tomcat 7.0.68

同样的问题:

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

【问题讨论】:

    标签: java tomcat centos jasper-reports noclassdeffounderror


    【解决方案1】:

    所以这里要做一些检查:

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

      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 的用户/组是否可写。如果不是这样,就会抛出异常,但是被捕获并且不可见...

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-03
          • 2012-08-01
          • 2012-10-10
          • 2015-11-23
          • 2011-09-28
          相关资源
          最近更新 更多