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.html

2. 分析

  开发环境是window7,并无出现该问题。测试环境是linux,出现该错误。根据错误的字面意思,初步设想是linux服务器上没有该字体。java

3. 安装字体

  • 将window7上的中文字体安装到linux下
  • window7下字体所在位置:C:\Windows\Fonts。以下所示:

  • 将简体中文字体复制到linux下,保存路径为:/usr/share/fonts/chinese/TrueType。以下所示,可视化工具为WinSCP:

  • 使用命令安装字体:

  cd /usr/share/fonts/chinese/TrueTypelinux

  mkfontscale缓存

  mkfontdir服务器

  fc-cache –fv工具

  • 查看安装的字体:

  fc-list :lang-zh源码分析

 

  注意图中所选的字体微软雅黑,左边中中文表示,右边是英文表示测试

4. 再分析

  若重启服务后,问题已经解决,那么恭喜。可是我在实际状况下,很明确的linux下已经安装了字体,但仍是提示错误。这极可能是环境不同引发的问题,因此我想到了远程debug调试,远程调试配置:http://www.cnblogs.com/zhuqianchang/p/9044699.html字体

报错的位置在FontUtil.java350行,查看源码以下:spa

 

  根据源码分析,先获取系统的字体加入缓存,缓存是一个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. 重启服务

  根据源码,系统字体保存在缓存中,因此须要重启服务。重启后,问题顺利解决

相关文章
相关标签/搜索