Docker: java.lang.NoClassDefFoundError: sun.awt.X11FontManager

简介: Docker: java.lang.NoClassDefFoundError: sun.awt.X11FontManager

目录

问题现象

问题原因:

问题解决:

容器环境下

非容器环境下


 


问题现象

Dockerfile基础镜像从 java:8

更换为 adoptopenjdk/openjdk8-openj9:alpine-slim 后

登录页面的验证码无法加载,并报错

2021-08-24 01:30:25.763 ERROR 1 --- [or-http-epoll-4] reactor.netty.http.server.HttpServer     : [id: 0xf73ab911, L:/172.23.0.4:8081 - R:/10.0.159.222:52873] 
java.lang.NoClassDefFoundError: sun.awt.X11FontManager (initialization failure)
  at java.lang.J9VMInternals.initializationAlreadyFailed(Unknown Source) ~[na:1.8.0_302]
  at java.lang.Class.forNameImpl(Native Method) ~[na:1.8.0_302]
  at java.lang.Class.forName(Unknown Source) ~[na:1.8.0_302]
  at sun.font.FontManagerFactory$1.run(Unknown Source) ~[na:1.8.0_302]
  at java.security.AccessController.doPrivileged(Unknown Source) ~[na:1.8.0_302]
  at sun.font.FontManagerFactory.getInstance(Unknown Source) ~[na:1.8.0_302]
  at java.awt.Font.getFont2D(Unknown Source) ~[na:1.8.0_302]
  at java.awt.Font.access$000(Unknown Source) ~[na:1.8.0_302]
  at java.awt.Font$FontAccessImpl.getFont2D(Unknown Source) ~[na:1.8.0_302]
  at sun.font.FontUtilities.getFont2D(Unknown Source) ~[na:1.8.0_302]
  at com.google.code.kaptcha.text.impl.DefaultWordRenderer.renderWord(DefaultWordRenderer.java:66) ~[kaptcha-2.3.2.jar!/:2.3.2]
  at com.google.code.kaptcha.impl.DefaultKaptcha.createImage(DefaultKaptcha.java:43) ~[kaptcha-2.3.2.jar!/:2.3.2]
  at com.jiean.gateway.service.impl.ValidateCodeServiceImpl.createCapcha(ValidateCodeServiceImpl.java:61) ~[classes!/:na]
  at com.jiean.gateway.handler.ValidateCodeHandler.handle(ValidateCodeHandler.java:33) ~[classes!/:na]
  at 
  at java.lang.Thread.run(Unknown Source) [na:1.8.0_302]
Caused by: java.lang.UnsatisfiedLinkError: fontmanager (libfreetype.so.6: cannot open shared object file: No such file or directory)


问题原因:

这种一般是出现在 docker部署,且使用了精简版的基础镜像,有多精简呢?精简到把字体都阉割掉了,好狠…

如果你的项目有字体相关操作,比如导出 excel,验证码,就会报上述异常。

对于一个Java服务器来说经常要处理一些图形元素,例如地图的创建或者图形和图表等。这些API基本上总是需要运行一个X-server以便能使用AWT(Abstract Window Toolkit,抽象窗口工具集)。


问题解决:

容器环境下

换个东西全一点的镜像;

FROM java:8

在构建镜像时安装字体,dockerfile增加命令:

RUN yum install dejavu-sans-fonts fontconfig -y

如果 container已经启动,又不想换,那就直接进到 container,安装字体:

yum install dejavu-sans-fonts fontconfig -y


非容器环境下

从代码层面手工设置了 System.setProperty("java.awt.headless","true"); 解决问题。

@SpringBootApplication
public class EbootApplication {
   public static void main(String[] args) {
      System.setProperty("java.awt.headless", "true");
      SpringApplication.run(EbootApplication.class, args);
   }
}

什么是Headless mode?Headless模式是系统的一种配置模式。在该模式下,系统缺少了显示设备、键盘或鼠标。

一般是在程序开始激活headless模式,告诉程序,现在你要工作在Headless mode下,就不要指望硬件帮忙了,自力更生并依靠系统的计算能力模拟出这些特性来。


目录
相关文章
|
6月前
|
Java Linux Docker
阿里云云效流水线自动化构建Java项目并发布到docker环境
阿里云云效流水线自动化构建Java项目并发布到docker环境
355 0
|
1月前
|
Java 网络安全 开发者
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)
44 0
|
2月前
|
运维 Java 开发者
深入浅出:使用Docker容器化改善Java应用的部署与运维
在当今快速迭代的软件开发周期中,确保应用的一致性、可移植性与易于管理成为了开发与运维团队面临的重大挑战。本文旨在介绍如何通过Docker容器技术,有效地解决这些问题,特别是针对Java应用。我们将从Docker的基本概念出发,逐步深入到实际操作,展示如何将传统的Java应用容器化,以及这一过程如何帮助简化部署流程、提高应用的可靠性和可伸缩性。不同于常规的技术文章,本文试图以一种更加易于理解和实践的方式,让读者能够快速掌握容器化技术,并将其应用于日常的开发与运维工作中。
93 0
|
2月前
|
运维 Java Linux
深入解析:使用Docker容器化技术提升Java应用的部署效率
在快速迭代的软件开发周期中,如何保证应用的快速、一致和可靠部署成为了开发团队需要面对的重大挑战。本文将探讨如何利用Docker容器化技术,结合Java应用,实现高效、一致的部署流程。我们将从Docker的基本概念出发,详细介绍将Java应用容器化的步骤,包括创建Dockerfile、构建镜像以及运行容器等关键环节,并通过示例代码加以说明。此外,本文还将讨论在使用Docker部署Java应用时可能遇到的常见问题及其解决策略,旨在为读者提供一种提升部署效率、优化开发流程的有效方法。
303 2
|
2月前
|
Java 持续交付 虚拟化
深入浅出:使用Docker容器化改善Java应用的开发与部署流程
在快速迭代与持续集成的软件开发周期中,确保应用在各种环境中一致运行是一个挑战。本文介绍了如何利用Docker容器技术,来容器化Java应用,以实现环境一致性、简化配置和加速部署过程。我们将从Docker的基础知识开始,探讨其与传统虚拟机的区别,进而深入到如何创建Dockerfile,构建镜像,以及运行和管理容器。此外,文章还将涵盖使用Docker Compose来管理多容器应用的策略,以及如何利用容器化改善CI/CD流程。通过本文,读者将获得关于如何高效地利用Docker改善Java应用开发与部署流程的实践指导。
160 1
|
2月前
|
运维 Java 云计算
深入浅出:使用Docker容器化改进Java应用部署
在当前快速演变的软件开发领域,Docker作为一种开源的容器化技术,已经成为优化应用部署、实现快速交付和高效率运维的关键工具。本文将探讨如何利用Docker容器化技术来改进Java应用的部署流程。我们不仅会介绍Docker的基础知识,还会通过一个实际的Java应用示例,详细展示从创建Dockerfile到构建镜像,再到运行容器的整个过程。此外,文章还将探讨容器化带来的好处,如环境一致性、便捷的版本控制和简化的部署流程等,力求为读者提供一个清晰、易懂的指南,帮助他们在自己的项目中实现Docker容器化,从而提升开发和部署效率。
170 1
|
2月前
|
运维 Java 持续交付
深入浅出:使用Docker容器化改善Java应用的部署与运维
在当今快速发展的软件开发领域,持续集成与持续部署(CI/CD)已成为提高开发效率和软件质量的关键。本文将探讨如何利用Docker容器技术,实现Java应用的高效部署与运维。我们将从Docker的基本概念入手,详细介绍如何将传统的Java应用容器化,并通过实际案例展示容器化带来的便利性和高效性。此外,文章还将探讨Docker容器与传统虚拟机部署方式的对比,以及如何在实际项目中选择最适合的部署策略。通过本文,读者将能够深入理解Docker容器化技术,并学会如何在自己的Java项目中实施和优化。
228 1
|
2月前
|
运维 Java 开发者
深入浅出:使用Docker容器化改善Java应用的部署与运维
在快速迭代与持续集成的开发周期中,如何确保Java应用的一致性、高效部署及易于管理成为了开发与运维团队面临的重大挑战。本文将探讨Docker容器技术如何为Java应用提供一种轻量级、可移植的解决方案,实现环境一致性、简化配置过程并提高开发到生产的流程效率。我们将从Docker的基本概念入手,通过实例详细说明如何将传统的Java应用容器化,以及如何利用Docker Compose来管理多容器应用,最后探讨在使用Docker部署Java应用时的最佳实践和常见问题解决策略。
256 1
|
2月前
|
存储 Java Docker
深入浅出:使用Docker容器化改进Java微服务架构
在快速演进的软件开发领域,微服务架构已成为构建可扩展、灵活且独立部署的应用程序的首选模式。然而,随着服务数量的增加,管理与部署这些服务的复杂性也随之上升。本文将探讨如何利用Docker容器技术,简化并优化Java微服务架构的开发、部署和运维流程。通过具体实例,我们将展示容器化如何为微服务架构带来的高效性、一致性和可伸缩性,从而使开发团队能够更加专注于业务逻辑的实现,而非环境的搭建与维护。
23 1
|
2月前
|
Java Docker 容器
百度搜索:蓝易云【Docker使用之java项目工程的部署】
通过以上步骤,你已经成功在Docker中部署了Java项目工程。这样可以确保你的应用在不同环境中具有一致的运行结果,并且方便地进行部署和管理。
36 7