之前开发的应用都是基于OracleJDK 1.8来做的,图片验证码显示正常,但是更换成OpenJDK1.8后,验证码无法显示,后台代码抛出异常,异常内容如下,java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java 1264)
可以看到,猜测是因为验证码的API用到了AWT的东西,但是Openjdk少了些啥。经过不断的折腾,发现后续的OpenJDK同样存在这些问题,在网上找了很多办法也没有用,后来发现需要在操作系统层面安装FontConfig组件。本人环境使用的是Centos 7.3 于是直接安装FontConfig即可,如果你使用的docker容器环境,需要在镜像中进行安装,并执行fc-ache --force(必须执行)
yum install fontconfig
fc-cache --force
之前开发的应用都是基于OracleJDK 1.8来做的,图片验证码显示正常,但是更换成OpenJDK1.8后,验证码无法显示,后台代码抛出异常,异常内容如下,java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java 1264)可以看到,猜测是因为验证码的API用到了...
C#调用JAVA所需要用到的工具类 ikvm-8.1.5717.0+IKVM.OpenJDK.ClassLibrary.dll
官方下载地址:
http://www.ikvm.net/download.html
https://www.mono-project.com/download/stable/
1.情况说明
自己开发项目的时候都是基于OracleJDK 1.8来做的,图片验证码可以正常显示。但是发布到docker更换成OpenJDK1.8后,
验证码无法显示,后台代码抛出异常,就是各种工具类没有找到没有初始化,异常内容如下,
openjdk比oraclejdk简化了一些功能,所以用docker打包的时候更小。
所以后端画的验证码所要用到java的awt组件就被简化了,就一堆的空指针无法初始化错误报出来。
3.解决方法
1.笔者使用的是centos7系统,需要在系统中安装FontConf
记一次由oracle jdk 切换为open jdk引起的图形验证码报错
一.背景及报错原因分析
因为oracle jdk1.8之后要开始收费了,公司不得已转入使用openJDK。
环境的主要区别是生产使用的是OpenJDK,而之前应用都是基于OracleJDK 1.8来做的,图片验证码使用awt来画的,使用OracleJDK 1.8显示正常。但是更换成OpenJDK1.8后,验证码无法显示,后台代码抛出异常:
java.lang.NullPointerException at sun.awt.FontCo
前几天公司一个项目在升级时发现以前现有登录验证码出现数字不清楚,因为服务器是用的新的服务器,当然tomcat与jdk也是新部署的,所以第一直觉以为是linux操作系统图形化包的问题,然后开始各种排查图形化安装包的版本,后来也怀疑是linux操作系统字体问题,但最终也没有解决。
后来相关部署同事突然想到应用部署时选用的是linux自带的open jdk7的版本,怀疑可能是jdk版本的问题,所以
二、原因分析
代码没变过,一样的包,那只能从部署环境找问题。仔细对比了现在和以前的环境,发现之前用的是JDK1.8,现在用的是OpenJDK8。查了一些资料,证实了一件事情——OpenJDK不支持awt包下的字体。
三、解决办法
解决办法有两个,要么改
系统开发是用oracle jdk1.8 , 因为收费问题, 所以想切换到openjdk , 最后选择了alibaba的dragonwall8.0GA版,刚切换过去,就发现图形验证码不显示. 报如下错误
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.getVersion(FontConfiguratio...
应用的验证码无法显示,报错:
java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion
经百度,发现是图形验证码依赖了系统组件,只需安装依赖即可解决。
Centos 7 系统:
➜ yum install fontconfig
➜ fc-cache --force
Alpine 系统:
➜ apk add fontconfig
➜ apk add --update ttf-dejavu
➜ fc-cac
<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha-all</artifactId>
<version>1.0-RC6</version>
<exc
出错如下:
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) ~[na:1.8.0_111-internal]
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219) ~[na:1.8.0_111-internal]
at sun.awt.Font
FROM openjdk:8-jdk-alpine
COPY ./target/*.jar /project/project.jar
COPY simsun.ttc /usr/share/fonts/ttf-dejavu/simsun.ttc
RUN echo "http://mirrors.aliyun.com/alpine/v3.6/main" >...
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.uti...
1.问题复现
在开发时本地使用oraclejdk开发,可正常显示验证码,使用docker打包时,为了降低包大小,切换为openjdk,上线后发现验证码无法正常显示,且后台显示以下异常:
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:126...
Kubernetes CoreDNS Plugin/loop:Seen "HINFO IN xxxxxxx." more than twice,loop detected 问题解决方法