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. 重啓服務

  根據源碼,系統字體保存在緩存中,因此須要重啓服務。重啓後,問題順利解決

相關文章
相關標籤/搜索