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. 重啓服務
根據源碼,系統字體保存在緩存中,因此須要重啓服務。重啓後,問題順利解決