Font \"微软雅黑\" is not available to the JVM. See the Javadoc for more details.
1. 背景
在工作中使用JasperReport生成报表,会出现错误Font \"微软雅黑\" is not available to the JVM. See the Javadoc for more details.
2. 分析
开发环境是window7,并没有出现该问题。测试环境是linux,出现该错误。根据错误的字面意思,初步设想是linux服务器上没有该字体。
3. 安装字体
- 将window7上的中文字体安装到linux下
- window7下字体所在位置:C:\Windows\Fonts。如下所示:
- 将简体中文字体复制到linux下,保存路径为:/usr/share/fonts/chinese/TrueType。如下所示,可视化工具为WinSCP:
- 使用命令安装字体:
cd /usr/share/fonts/chinese/TrueType
mkfontscale
mkfontdir
fc-cache –fv
- 查看安装的字体:
fc-list :lang-zh
注意图中所选的字体微软雅黑,左边中中文表示,右边是英文表示
4. 再分析
若重启服务后,问题已经解决,那么恭喜。但是我在实际情况下,很明确的linux下已经安装了字体,但还是提示错误。这很可能是环境不一样引起的问题,所以我想到了远程debug调试,远程调试配置:http://www.cnblogs.com/zhuqianchang/p/9044699.html
报错的位置在FontUtil.java350行,查看源码如下:
根据源码分析,先获取系统的字体加入缓存,缓存是一个Set集合,然后判断指定字体是否在集合中。所以debug进去后,查看缓存中的字体,发现确实不存在字体“微软雅黑”,但是却发现了字体“Microsoft YaHei”。所以问题明确了,虽然安装了字体,但linux系统语言是英语,所以导致contains方法并不能匹配到字体“微软雅黑”,所以报错。
5. 修改系统语言
- 查看当前语言
echo $LANG
- 修改语言
vi /etc/sysconfig/i18n
英文:LANG="en_US.UTF-8"
中文:LANG="zh_CN.UTF-8"
- 即时生效
source /etc/sysconfig/i18n
6. 重启服务
根据源码,系统字体保存在缓存中,所以需要重启服务。重启后,问题顺利解决