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

centosjasper-reportsjavanoclassdeffounderrortomcat

I would like to share my experience with a more or less common error with JasperReports.

When executing JasperReports to make a PDF report, I have an exception :

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)

My environment :

  • CentOs 6.6 – Kernel 2.6.32-504.el6.x86_64
  • Java 1.7_79 (Sun)
  • JasperReport 6.2.2
  • Apache Tomcat 7.0.68

Same question that:

I tried these solutions without success.

Best Answer

So here some checks to do :

  • Red Hat KB : https://access.redhat.com/solutions/1311113.
    VMWare KB : https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2010240.
    Your environment should have X11 and/or graphic packages (fonts etc.) installed OR you have to run Java with -Djava.awt.headless=true option. With headless, your libraries needs to have fonts included (Default JasperReport font is Pictonic.ttf)
  • Clean your Tomcat Cache and don't do hot deployment. Some JasperReport versions have memory leaks with ThreadLocal uses in some classes. See for example http://community.jaspersoft.com/jasperreports-library/issues/4403-0
  • JRStyledTextParser have a static initializer which can mask some exceptions. It especially initializes the loading of fonts (on the OS or included in jar) in a cache by using Font implement in java.awt. But, see the source code of 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 create temp file (using java.io.tmp option if you have specified it). So check that your temporary folder is not full and writable by the user/group of Java PID. If it is not the case, an exception will be thrown, but catched and invisible...

Related Topic