使用docker部署SpringBoot项目时,验证码代码恰好调用了JDK1.8底层的FontConfiguration这个类生成图片。
结果前端调用的时候抛了个异常。如下

java.lang.NullPointerException: null
        at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
        at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
        at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
        at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)
        at sun.font.SunFontManager$2.run(SunFontManager.java:431)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.SunFontManager.<init>(SunFontManager.java:376)
        at sun.awt.FcFontManager.<init>(FcFontManager.java:35)
        at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at java.lang.Class.newInstance(Class.java:442)
        at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
        ......
        .....

比较有效的解决办法是装ttf-dejavu
修改前Dockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD xx.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

追加一句话重新打包、编译、部署即可。

RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig

修改后Dockerfile:

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD xx.jar app.jar
RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

由于验证码需要的特殊字体在系统里是不存在的,不过sun的JDK是可以调用的,而openJDK不行,所以要么换JDK、要么安装字体库。

问题使用docker部署SpringBoot项目时,验证码代码恰好调用了JDK1.8底层的FontConfiguration这个类生成图片。结果前端调用的时候抛了个异常。如下 123456789101112131415161718192021 java.lang.NullPointerException: null at sun.awt.FontConfiguration.getVersion(FontCon java.lang.NullPointerException: null 2020/5/29 上午8:40:11 at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264) 2020/5/29 上午8:40:11 at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)错问题解决 项目场景: 使用docker发布微服务时,因项目中有登录操作,需要图片验证码验证 问题描述: 由于在构建docker镜像时使用的是openjdk而不是oraclejdk,在生成图片验证码时出现了问题,后台java.lang.NullPointerException: null at sun.awt.FontConfiguration.g
线上遇到了一个问题,一个导出Excel的功能,在将数据生成excel文件到本地时,出现空指针异常。但是两台服务器只有一台服务器有这个问题,两台服务器的环境基本相同,使用同一个jar包,同样的请求。 异常信息 在本地,和另一台服务器验证都没有问题。 检查错的业务代码位置,写法没有问题,打印log,传参也都有值。 因此,基本不会是代码的问题。 百度打印出的第一行错信息FontConfiguration.getVersion。 得到第一个搜索结果FontConfiguration.getV
这三个问题都是本地好的,打包就不行的解决方案, FontConfiguration.java:1264 空指针问题由于使用了FROM openjdk:8-jdk-alpine造成的, 需要更换为FROM openjdk:8u212-jre 在Dockerfile文件中更改 改完之后又发现中文乱码。。。。 然后发现dacker打包的镜像缺少我需要的字体 解决方案就是将字体打入镜像 首先在Dockerfile文件的同级目录下放入需要的字体文件 .ttf文件格式的, 然后在Dockerfile文件中copy该
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.InternalError: java.lang.reflect.InvocationTargetException at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServle.
docker中OpenJDK excel无法导出 java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion 1.背景说明: 本地使用的是jdk1.8版本功能可正常使用,当通过docker打包镜像部署到linux环境下(openJDK1.8)后无法导出excel,初始化是否,空指针异常错如下: 2.原因: openjdk比jdk1.8简化了一些功能,所以用docker打包的时候更小。excel导出时初始化失败就是因为f
记录一下开发过程中遇到的问题 公司项目一直采用的都是OracleJDK 1.8版本,领导决定给项目的JDK升级到JDK11,我们采用的是开源的版本Liberica JDK 11,他们长期支持维护JDK8、JDK11、JDK17。 Liberica 官网链接 https://bell-sw.com/pages/downloads/#/java-17-lts%20/%20current。 在我们开发环境先行替换成OpenJDK11后, 项目中使用EasyExcel导出文件开始NullPointerEx
sudo apt install fontconfig 参考网址:java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion 出现这个错误是因为Docker中的工作簿(Workbook)已经包含了一个“s”。 Java.lang.IllegalArgumentException是Java中的一个异常类,用于指示方法接收了非法或不适当的参数。在这种情况下,异常的具体信息是the workbook already contains a s,意思是工作簿已经包含了一个“s”。 这个错误通常出现在使用Apache POI等Java库处理Excel文件时。工作簿(Workbook)是一个Excel文件的数据结构,它包含了多个工作表(Sheet)。在创建工作表之前,我们需要确保工作簿中没有重复名称的工作表。 解决这个问题的方法是在创建工作表之前,先检查工作簿中是否已经存在同名的工作表。如果存在,则抛出IllegalArgumentException异常,提示工作簿已经包含了一个相同名称的工作表。可以使用Workbook类的getSheet()方法来获取已有的工作表并进行判断。 另外,也可以考虑在创建新工作表时为其指定一个唯一的名称,以避免与已有工作表重名的情况。 综上所述,当在Docker中使用Java处理Excel文件时出现Java.lang.IllegalArgumentException:the workbook already contains a s的错误时,应该检查工作簿中是否已经存在相同名称的工作表,并根据需要进行工作表的创建和命名。 ### 回答2: 这个异常是因为在使用Docker时,调用了Java的Apache POI库的Workbook对象的createSheet方法,但是工作簿已经包含了一个同名的Sheet。 Workbook对象是Apache POI库中一个表示Excel工作簿的接口,其用于操作Excel的各种操作,包括创建和访问Sheet。createSheet方法是用于创建一个新的Sheet,并将其添加到工作簿中。 当调用createSheet方法时,会检查工作簿中是否已经存在了一个同名的Sheet。如果存在,则会抛出IllegalArgumentException异常,提示工作簿已经包含了一个同名的Sheet。 解决这个问题的方法是在添加Sheet之前,先检查工作簿中是否已经存在同名的Sheet,如果存在则先删除或重命名原有的Sheet,然后再调用createSheet方法。 示例代码如下: Workbook workbook = // 获取工作簿对象 String sheetName = // 要创建的Sheet的名称 // 检查工作簿中是否已经存在同名的Sheet if (workbook.getSheet(sheetName) != null) { // 存在同名的Sheet,可以选择删除或重命名原有的Sheet workbook.removeSheetAt(workbook.getSheetIndex(sheetName)); // 删除原有的Sheet // 或 workbook.setSheetName(workbook.getSheetIndex(sheetName), newName); // 重命名原有的Sheet Sheet sheet = workbook.createSheet(sheetName); // 创建新的Sheet 通过这样的处理,可以避免在Docker中使用Apache POI库时出现IllegalArgumentException异常。 nginx响应超时upstream timed out (110: Connection timed out) while reading response header from upstream 34147 使用阿里镜像比较快,但是还是建议自己安装字体库后打个镜像包: # 替换阿里镜像 RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories \ && apk update \ && apk upgrade \ && apk --no-cache add ttf-dejavu fontconfig 普通链接二维码打开小程序实现动态传递参数 m0_58735177: 传递参数是固定的没有实现动态吧 k8s搭建gitlab wst021sh: gitlab-redis-pvc.yaml 为啥没有? 只有 gitlab-postgresql-pvc.yaml 跟 gitlab-gitlab-pvc.yaml 的呢?