之前部署一个项目,在腾讯云主机上,是Ubuntu+OpenJDK1.9。项目在Windows下没问题,一部署到Linux上JVM就崩溃。后来根据日志跟踪到是CaptchaRender这个类中的问题。
protected void drawGraphic(String randomString, BufferedImage image){ ... g.setFont(RANDOM_FONT[random.nextInt(RANDOM_FONT.length)]); ... }
这段代码随机使用了一个字体数组,定义如下
protected static final Font[] RANDOM_FONT = new Font[] { new Font("nyala", Font.BOLD, 38), new Font("Arial", Font.BOLD, 32), new Font("Bell MT", Font.BOLD, 32), new Font("Credit valley", Font.BOLD, 34), new Font("Impact", Font.BOLD, 32), new Font(Font.MONOSPACED, Font.BOLD, 40) };
其中有字体在Linux下不存在。所以会有问题。我临时解决的办法是修改了CaptchaRender类,重新定义了一个MyCatchaRender类,添加数组
protected static final Font[] RANDOM_FONT_LINUX = new Font[]{ new Font(Font.MONOSPACED, Font.BOLD, 32), new Font(Font.SANS_SERIF, Font.BOLD, 32), new Font(Font.SERIF, Font.BOLD, 32) };
然后在drawGraphic方法中判断操作系统类型,如果是Windows则使用RANDOM_FONT数组,否则使用RANDOM_FONT_LINUX数组。
覆盖drawGraphic方法
protected void drawGraphic(String randomString, BufferedImage image){ ... //设定字体 if(StrUtil.containsAnyIgnoreCase(System.getProperty("os.name"),"windows")) { g.setFont(RANDOM_FONT[random.nextInt(RANDOM_FONT.length)]); }else{ g.setFont(RANDOM_FONT[random.nextInt(RANDOM_FONT_LINUX.length)]); }... }
上面用了hutool库。不知道其他人有没有这个问题。
项目:JFinal
http://www.jfinal.com/share/411
此外,jfinal 3.4 已改进了这里,采用了更为通用的字体,jfinal 3.4 还差几天发布,你可以通过这个贴子的办法先用上:
http://www.jfinal.com/share/714