背景
通常使用得是oracle jdk,但是有的需要使用open jdk,但是如果使用了字体相关得操作,如验证码就会出现找不到字体得问题。
验证码无法显示,后台代码抛出异常,异常内容如下,java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java 1264)
区别
- 授权协议的不同:
openjdk采用GPL V2协议放出,而JDK则采用JRL放出。
两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。 - OpenJDK不包含Deployment(部署)功能:
部署的功能包括:Browser Plugin、Java Web Start、以及Java控制面板,这些功能在Openjdk中是找不到的。 - OpenJDK源代码不完整:
在采用GPL协议的Openjdk中,sun jdk的一部分源代码因为产权的问题无法开放openjdk使用,其中最主要的部份就是JMX中的可选元件SNMP部份的代码。因此这些不能开放的源代码将它作成plug,以供OpenJDK编译时使用,你也可以选择不要使用plug。而Icedtea则为这些不完整的部分开发了相同功能的源代码(OpenJDK6),促使OpenJDK更加完整。 - 部分源代码用开源代码替换:
由于产权的问题,很多产权不是SUN的源代码被替换成一些功能相同的开源代码,比如说字体栅格化引擎,使用Free Type代替。 - openjdk只包含最精简的JDK:
OpenJDK不包含其他的软件包,比如Rhino Java DB JAXP……,并且可以分离的软件包也都是尽量的分离,但是这大多数都是自由软件,你可以自己下载加入。
解决字体问题
服务器可以联网
yum install fontconfig
fc-cache --force
不能联网(在代码中加载字体)
- 在项目得resource中添加一个fonts文件夹
- 找一个可以使用得字体,windows系统:打开C:\Windows\Fonts 目录,找个喜欢的字体,复制到项目里
- 代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.io.ClassPathResource;
import java.awt.*;
import java.io.InputStream;
public class FontUtils{
private static Font loadFontResource() throws Exception {
InputStream resourceAsStream = null;
try {
ClassPathResource classPathResource = new ClassPathResource("fonts/STXIHEI.TTF");
resourceAsStream =classPathResource.getInputStream();
Font font = Font.createFont(Font.TRUETYPE_FONT, resourceAsStream);
Font targetFont = font.deriveFont(Font.PLAIN);
return targetFont;
} catch (FontFormatException e) {
e.printStackTrace();
return null;
}
}
}
注意:"fonts/STXIHEI.TTF"相对路径如果获取不到,可以使用绝对路径