近期用到了动态生成二维码的功能,并且在二维码底下加文字,win下开发没有出现问题,但是部署到Linux环境下出现中文乱码。经排查之后发现代码中Font类(new Font("微软雅黑", Font.PLAIN, 35))用到了"微软雅黑"中文字体,但Centos默认没有这种字体,所以出现乱码。安装好字体后,重新启动Tomcat之后出现了:

java.lang.UnsatisfiedLinkError: sun.font.FreetypeFontScaler.initIDs(Ljava/lang/Class;)V

报错,然后多方论证确认是jdk的版本问题,我系统用的1.8.0_111,升级到1.8.0_191以后问题得以解决。此处贴出Linux安装字体步骤。

1. 在 /usr/share/fonts 目录底下创建文件夹 chinese(文件夹名称可自取)

2. 复制需要添加的字体文件 "*.ttf"或"*.ttc" 到  /usr/share/fonts/chinese

3. 移动到/usr/share/fonts/chinese目录底下,使用以下命令创建索引(生成fonts.scale和fonts.dir)

                   /usr/share/fonts/chinese # mkfontdir  

                  /usr/share/fonts/chinese # mkfontscale 

备注:如果命令不能正常识别请用以下方法安装。

  1. yum install mkfontscale

  2. yum install fontconfig

4. 刷新字体:fc-cache

5. 查看字体:fc-list

注:第3步如果提示 mkfontscale/mkfontdir: command not found,需自行安装 # yum install mkfontscale/mkfontdir。如果fc-list没有看到添加的字体,有可能是此字体受版权保护无法添加进去,建议换成免费字体。步骤执行完之后重启Tomcat服务就生效了。

bug详情:

Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:73)
	... 37 more
Caused by: java.lang.UnsatisfiedLinkError: sun.font.FreetypeFontScaler.initIDs(Ljava/lang/Class;)V
	at sun.font.FreetypeFontScaler.initIDs(Native Method)
	at sun.font.FreetypeFontScaler.<clinit>(FreetypeFontScaler.java:50)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:264)
	at sun.font.FontScaler.<clinit>(FontScaler.java:98)
	at sun.font.TrueTypeFont.getScaler(TrueTypeFont.java:1298)
	at sun.font.FileFontStrike.<init>(FileFontStrike.java:179)
	at sun.font.FileFont.createStrike(FileFont.java:95)
	at sun.font.Font2D.getStrike(Font2D.java:359)
	at sun.font.Font2D.getStrike(Font2D.java:281)
	at sun.java2d.SunGraphics2D.checkFontInfo(SunGraphics2D.java:774)
	at sun.java2d.SunGraphics2D.getFontInfo(SunGraphics2D.java:830)
	at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:50)
	at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2928)
	at cn.edu.group.ks.util.ImageUtil.addDetailOnPic(ImageUtil.java:61)
	at cn.edu.group.ks.service.impl.JsQrCodeServiceImpl.getJsQrCodeImge(JsQrCodeServiceImpl.java:113)
	at cn.edu.group.ks.service.impl.JsQrCodeServiceImpl.getJsQrCode(JsQrCodeServiceImpl.java:37)
	at cn.edu.group.ks.controller.js.ClassroomController.getQrCode(ClassroomController.java:168)
	at cn.edu.group.ks.controller.js.ClassroomController.batchQr(ClassroomController.java:183)
	... 42 more

重要的两步:

1.添加字体库;

2.如果未解决升级下jdk版本。

参考文章:https://www.jianshu.com/p/354d5ab51215

jdk的卸载及升级参考:Linux中以rpm方式安装JDK_阿枫的博客-CSDN博客_rpm安装jdk

Logo

更多推荐