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)
我的环境:
- CentOs 6.6 - 内核 2.6.32-504.el6.x86_64
- Java 1.7_79(星期日)
- JasperReport 6.2.2
- 阿帕奇 Tomcat 7.0.68
同样的问题:
- java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
- http://community.jaspersoft.com/questions/536539/noclassdeffounderror-jrstyledtextparser-initialization-failure
我尝试了这些解决方案但没有成功。
所以这里要做一些检查:
- 红帽知识库: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 也会对报告生成过程造成巨大破坏。
所以检查服务器中的以下项目
- 服务器space
- tomcat 服务器中缺少文件夹
我在几个小时后找到了解决方案。如果您使用 bitnami docker 撰写文件,您必须对 java 文件夹进行卷。报告是 运行 java 1.8_201 版本。因此,您应该下载 1.8_201 并将其调整为您的 docker 撰写。
volumes:
- 'jasperreports_data:/bitnami/jasperreports'
- '/path/your/downloaded/java:/opt/bitnami/java'
我想与 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
- 阿帕奇 Tomcat 7.0.68
同样的问题:
- java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser
- http://community.jaspersoft.com/questions/536539/noclassdeffounderror-jrstyledtextparser-initialization-failure
我尝试了这些解决方案但没有成功。
所以这里要做一些检查:
- 红帽知识库: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 也会对报告生成过程造成巨大破坏。
所以检查服务器中的以下项目
- 服务器space
- tomcat 服务器中缺少文件夹
我在几个小时后找到了解决方案。如果您使用 bitnami docker 撰写文件,您必须对 java 文件夹进行卷。报告是 运行 java 1.8_201 版本。因此,您应该下载 1.8_201 并将其调整为您的 docker 撰写。
volumes:
- 'jasperreports_data:/bitnami/jasperreports'
- '/path/your/downloaded/java:/opt/bitnami/java'