【实战】 容器中Spring boot项目 Graphics2D 画图中文乱码解决方案

场景

架构:spring boot
容器技术:docker
服务器:阿里云
开发环境:windows10 + IDEA

一、问题

服务器中出现Graphics2D 画图中文乱码
本地环境运行正常

二、原因

spring boot 容器中没有安装中文字体

三、解决方案

安装字体即可

四、实战

Step 1:服务器安装中文字体

Step 1-1:安装常见中文字体

Noto 系列字体 (Google 提供)
sudo apt update
sudo apt install fonts-noto-cjk  # 包含简体中文、繁体中文、日文和韩文字体
sudo fc-cache -fv  # 更新字体缓存

Step 1-2: 查看已安装的中文字体

# 查看所有已安装的中文字体
fc-list :lang=zh

# 查看特定字体族
fc-list | grep "WenQuanYi"
fc-list | grep "Noto Sans CJK"

在这里插入图片描述

Step 2:Spring boot - 引用字体

Step 2-1:字体复制到resources下

src/main/resources/fonts/opentype/noto/NotoSansCJK-Bold.ttc
字体可以在1-2服务器路径中copy出来
在这里插入图片描述

Step 2-2:代码中引用

ClassPathResource resource = new ClassPathResource("fonts/opentype/noto/NotoSansCJK-Bold.ttc");

    public static Font loadCustomFont() {
        try {
            // 从 resources 加载字体文件流
            ClassPathResource resource = new ClassPathResource("fonts/opentype/noto/NotoSansCJK-Bold.ttc");
            InputStream fontStream = resource.getInputStream();

            // 创建字体(TrueType 或 OpenType 字体使用 Font.TRUETYPE_FONT)
            Font font = Font.createFont(Font.TRUETYPE_FONT, fontStream);

            // 设置字体大小和样式(可选)
            font = font.deriveFont(Font.BOLD, 120f); // 120f 为字号

            return font;
        } catch (Exception e) {
            e.printStackTrace();
            // 回退到默认字体
            return new Font("Arial", Font.BOLD, 30);
        }
    }

Step 3:spring boot 容器安装字体

Step 3-1:修改 Dockerfile

目的:
1、JDK8 更换 AdoptOpenJDK 的 Debian 基础镜像更容易安装字体。
2、安装字体管理系统

整改前:
FROM docker.io/library/openjdk:8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY ./config /config
COPY ./lib /lib
ADD xxx.jar xxx.jar
ENTRYPOINT ["java","-Dloader.path=/lib","-jar","xxx.jar"]
整改后:
FROM  adoptopenjdk/openjdk8:jdk8u292-b10-debian
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    apt-get update && \
    apt-get install -y fontconfig && \
    rm -rf /var/lib/apt/lists/* && \
    fc-cache -fv 
COPY ./config /config
COPY ./lib /lib
ADD xxx.jar xxx.jar
ENTRYPOINT ["java","-Dloader.path=/lib","-jar","xxx.jar"]

Step 3-2:修改 docker-compose.yaml

目的:挂在系统字体到镜像中 - /usr/share/fonts:/usr/share/fonts

在这里插入图片描述

Step 4:重新构建镜像

# 进入docker-compose.yaml 所在目录
cd /xxx/xxx

# 重新构建镜像
docker-compose up -d --build

五、附录:指令详解

这些指令是在基于 Debian/Ubuntu 的 Linux 系统中用于字体管理的常见操作组合。下面是对每条指令及其组合作用的详细说明:


1. apt-get install -y fontconfig

  • 作用:安装 fontconfig 字体管理系统
  • 详细说明
    • apt-get install:Debian/Ubuntu 系统的包安装命令
    • -y:自动确认(跳过 “Do you want to continue? [Y/n]” 的交互提示)
    • fontconfig:Linux 系统核心字体配置工具,提供:
      • 字体扫描和缓存管理
      • 字体匹配和替换规则
      • 系统级和用户级字体配置
  • 典型输出
    Reading package lists...
    Building dependency tree...
    Installing fontconfig (2.13.1-4.2)...
    

2. rm -rf /var/lib/apt/lists/*

  • 作用:清理 APT 软件包缓存
  • 详细说明
    • /var/lib/apt/lists/:存储 apt update 下载的软件包元数据
    • rm -rf:递归强制删除
    • 目的
      • 减小 Docker 镜像体积(可节省 20-50MB 空间)
      • 避免使用过时的软件包列表
    • 安全影响
      • 不会删除已安装的软件
      • 下次执行 apt update 会重新生成列表

3. fc-cache -fv

  • 作用:重建字体缓存
  • 详细说明
    • fc-cache:fontconfig 的缓存生成工具
    • -f:强制重建(即使缓存已存在)
    • -v:显示详细处理信息(verbose)
    • 典型输出
      /usr/share/fonts: caching, new cache contents: 6 fonts, 0 dirs
      /usr/local/share/fonts: caching, new cache contents: 0 fonts, 0 dirs
      
    • 缓存位置~/.cache/fontconfig//var/cache/fontconfig/

组合指令的整体作用

apt-get install -y fontconfig && \
rm -rf /var/lib/apt/lists/* && \
fc-cache -fv
  1. 安装字体配置系统(必需依赖)
  2. 清理临时文件(优化镜像体积)
  3. 初始化字体缓存(使新安装的字体立即可用)

典型使用场景

在 Dockerfile 中:
RUN apt-get update && \
    apt-get install -y fontconfig && \
    rm -rf /var/lib/apt/lists/* && \
    fc-cache -fv
  • 注意事项
    • 必须先在同一个 RUN 中执行 apt-get update,否则可能安装失败
    • && 确保前一条命令成功才执行后续命令
    • \ 是 Dockerfile 中的换行符
在普通 Linux 系统中:
sudo apt update && \
sudo apt install -y fontconfig && \
sudo rm -rf /var/lib/apt/lists/* && \
sudo fc-cache -fv

故障排查

如果命令失败:

  1. 检查网络连接(ping archive.ubuntu.com
  2. 确认有足够的磁盘空间(df -h
  3. 查看详细错误(去掉 -y 参数或添加 -o Debug::pkgProblemResolver=1

延伸知识

  • 字体安装后通常需要重启应用才能生效
  • 用户级字体缓存存放在 ~/.cache/fontconfig/
  • 查看已加载字体:fc-list
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ladymorgana

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值