JasperReports:java.lang.NoClassDefFoundError:无法初始化类net.sf.jasperreports.engine.util.JRStyledTextParser

时间:2017-03-30 09:13:11

标签: java tomcat centos jasper-reports noclassdeffounderror

我想与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(Sun)
  • JasperReport 6.2.2
  • Apache Tomcat 7.0.68

同样的问题:

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

2 个答案:

答案 0 :(得分:1)

所以这里要做一些检查:

  • 红帽KB:https://access.redhat.com/solutions/1311113
    VMWare KB:https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2010240
    您的环境应该安装X11和/或图形包(字体等),或者您必须使用-Djava.awt.headless=true选项运行Java。无头,你的库需要包含字体(默认JasperReport字体是Pictonic.ttf)
  • 清理Tomcat缓存,不要进行热部署。一些JasperReport版本的内存泄漏,ThreadLocal在某些类中使用。例如,请参阅http://community.jaspersoft.com/jasperreports-library/issues/4403-0
  • 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用户/组写入并且是否可写。如果不是这种情况,则会抛出一个异常,但会被捕获并且不可见......

答案 1 :(得分:1)

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

中的问题而发生的

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

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

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

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