Linux环境下部署jasperreport出现net.sf.jasperreports.engine.util.JRFontNotFoundException

如题所示的错误完整语句如下:

net.sf.jasperreports.engine.util.JRFontNotFoundException: Font '宋体' is not available to the JVM.  See the Javadoc for more details。。

这是一个很闹心的问题,你会发现你在windows环境开发,报表显示的好好的,但是开开心心部署到lInux环境时,可能就会给你泼如题所示的冷水。

要解决这个问题要从2方面考虑:

 

1)Linux在没有安装报表所需中文字体的情况:

第一步:安装方法——转到Linux环境下的/usr/share/fonts路径下,新建一个dir如zh_CN,把准备好的中文字体传到该目录下(中文字体的获取可以从windows环境的C:/Windows/Fonts下拷贝~),再执行如下命令:

mkfontscale
mkfontdir 
fc-cache -fv 

 即可成功安装字体。可以执行命令:

fc-list

 查看是否安装好字体。

第二步:(很重要!!)在项目的classes目录下加一个jasperreports.properties配置文件,添加内容如下:

 

net.sf.jasperreports.awt.ignore.missing.font=true

再重启项目即可~~

(以上方法亲测有效)

 

2)考虑到可移植性,把字体打包成jar放在项目里面。

这种方法我尝试了并没有起作用,可能是因为之前我已成功在Linux里安装好了中文字体的原因?但是我觉得也是一个比较靠谱的办法,所以记录下,可能以后用得着呢。。

前往官方社区下载jasperreports-6.2.0的完整版项目,解压后里面会有很多demo,找到fonts这个项目:

<%=你的jasperreport目录%>/demo/fonts.。

再转到net\sf\jasperreports\fonts\dejavu目录,把里面自带的字体删除,换上你自己的中文字体如STFANGSO.TTF(仿宋),然后修改net\sf\jasperreports\fonts下面的fonts.xml,这里以仿宋为例吧:

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
	<fontFamily name="仿宋">
		<normal>net/sf/jasperreports/fonts/dejavu/STFANGSO.TTF</normal>
		<bold>net/sf/jasperreports/fonts/dejavu/STFANGSO.TTF</bold>
		<italic>net/sf/jasperreports/fonts/dejavu/STFANGSO.TTF</italic>
		<boldItalic>net/sf/jasperreports/fonts/dejavu/STFANGSO.TTF</boldItalic>
		<pdfEncoding>Identity-H</pdfEncoding>
		<pdfEmbedded>true</pdfEmbedded>
		<exportFonts>
			<export key="net.sf.jasperreports.html">'仿宋', Arial, Helvetica, sans-serif</export>
			<export key="net.sf.jasperreports.xhtml">'仿宋', Arial, Helvetica, sans-serif</export>
		</exportFonts>
		<!--
		<locales>
			<locale>en_US</locale>
			<locale>de_DE</locale>
		</locales>
		-->
	</fontFamily>
</fontFamilies>

 好了,现在开始着手把修改后的字体项目打成jar包:

 在dos窗口转至:jasperreports-6.2.0\demo\fonts,执行如下命令:

jar cvf fonts.jar *

 fonts.jar即是你封装好的字体jar,可以反编译查看其大致结构:



 然后把这个jar包放到classpath下,同时也别忘了在classes目录下加上一个如1)情况所讲的配置文件。

【注:这种方法我目前还没有测通,可能是因为已经在Linux安装好字体的原因~】

 

3)其他方法

参考于网络但大多数都没测通,可能情况不同采取的方法不同。

### Java中关于NoClassDefFoundError的错误分析 `java.lang.NoClassDefFoundError` 是一种常见的运行时异常,通常表示某个类在编译时存在但在运行时无法加载。对于 `org/springframework/ui/jasperreports/JasperReportsUtils` 和其他与 JasperReports 或 GroovyEvaluator 相关的类缺失问题,以下是可能的原因及其解决方案。 #### 1. **Maven依赖冲突** 如果项目使用 Maven 构建,则可能是由于依赖冲突引起的。当多个版本的相同库被引入到项目的 classpath 中时,可能会导致某些类不可用。可以通过以下方法排查并解决问题: - 使用 Maven Dependency 插件检查依赖树: ```bash mvn dependency:tree -Dverbose -Dincludes=org.springframework.ui.jasperreports ``` 这条命令会显示所有涉及 `org.springframework.ui.jasperreports` 的依赖项以及潜在的冲突信息[^2]。 - 解决方案:排除不必要的依赖项或锁定特定版本。例如,在 `pom.xml` 文件中显式声明所需的 Spring 和 JasperReports 版本: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.17.0</version> </dependency> ``` #### 2. **缺少必要的依赖项** 如果未正确导入 JasperReports 所需的核心库或其他相关组件(如 Groovy),则可能导致此类问题。确保以下依赖已添加至 `pom.xml`: - 添加 JasperReports 核心库: ```xml <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.17.0</version> </dependency> ``` - 如果需要支持 Groovy 脚本评估器 (GroovyEvaluator),还需加入 Groovy 库: ```xml <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>3.0.9</version> </dependency> ``` #### 3. **Spring MVC 配置中的问题** Spring 提供了一个用于集成 JasperReports 的工具类 `JasperReportsUtils`,但如果使用的 Spring 版本较旧或不兼容,则可能出现该类找不到的情况。建议升级到最新稳定版的 Spring Framework 并验证其文档说明是否仍提供此工具类的支持[^1]。 另外需要注意的是,随着 Spring Boot 及模块化设计的发展,部分功能已被废弃或迁移至独立子项目中;因此应仔细查阅官方发行日志确认具体改动情况。 #### 4. **Runtime ClassLoader 加载失败** 即使所有的 jar 包都存在于 build path 下,仍然可能发生 runtime error 若这些资源未能成功注册给 application server 的 ClassLoader 。此时可以尝试调整打包策略或将第三方 lib 放入容器全局共享目录下测试效果如何改善。 --- ### 示例代码片段 下面是一个简单的示例展示如何利用 JasperReports 导出 PDF 报告文件,并确保所需的所有外部库均已正确定义于 pom.xml 当中: ```java import net.sf.jasperreports.engine.*; import java.util.HashMap; public class ReportGenerator { public static void main(String[] args) throws Exception{ String sourceFileName = "/path/to/your/report.jrxml"; HashMap<String, Object> parameters = new HashMap<>(); parameters.put("ParameterName", "ParameterValue"); JasperReport jasperReport = JasperCompileManager.compileReport(sourceFileName); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters,new JREmptyDataSource()); JasperExportManager.exportReportToPdfFile(jasperPrint,"output.pdf"); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值