UnsatisfiedLinkError:系统库路径中没有 fontmanager:/usr/lib/jvm/java-17-openjdk/lib

Den*_*n B 6 java docker alpine-linux java-17

在我们将容器迁移到 alpine_java-17 后,Excel 导出功能失败并出现以下错误:

java.lang.UnsatisfiedLinkError: no fontmanager in system library path: /usr/lib/jvm/java-17-openjdk/lib
Run Code Online (Sandbox Code Playgroud)

在我的 Dockerfile 中我安装了:

RUN apk add --no-cache fontconfig
RUN apk add --no-cache ttf-dejavu
RUN apk add --no-cache freetype
Run Code Online (Sandbox Code Playgroud)

这是 Dockerfile 的简短版本:

    FROM custom_registry/alpine_java-17


ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk


# procps to have the binary 'pgrep'
RUN apk update
RUN apk add curl
RUN apk add procps

#here's mu solution to fix the issue
RUN apk add --no-cache fontconfig
RUN apk add --no-cache ttf-dejavu
RUN apk add --no-cache freetype

# install bash
RUN apk add --no-cache bash

ENTRYPOINT [ "/app/bin/run.sh" ]
Run Code Online (Sandbox Code Playgroud)

但这没有帮助。也许有人知道如何解决这个问题?提前致谢!

Hed*_*ley 3

几种选择:

首先,Alpine 上的标准 Java 安装是“无头”Java,它在 JRE lib 目录中不包含任何图形库。您需要确保安装了非无头 JRE。例如在你的 Dockerfile 中

RUN apk add --no-cache curl openjdk17-jre
Run Code Online (Sandbox Code Playgroud)

如果仍然失败,您可能需要调试本机库。

看起来您已经安装了正确的软件包,但它们的默认位置不是 Java 正在查找的 /usr/lib/jvm/java-17-openjdk/lib 位置。

您可以使用 apk 来确认软件包的安装位置,我的猜测是 /usr/lib。

/ $ apk -L info fontconfig
Run Code Online (Sandbox Code Playgroud)

示例输出(用于 lcms)

lcms2-2.12-r1 contains:
usr/lib/liblcms2.so.2
usr/lib/liblcms2.so.2.0.12
Run Code Online (Sandbox Code Playgroud)

那么我认为你有几个选择:

  1. 将 /usr/lib/jvm/java-17-openjdk/lib 目录中的符号链接添加到实际库位置。

  2. 更新指定系统库位置的 java 启动属性。例如

    -Djava.library.path="/usr/lib/jvm/java-17-openjdk/lib:/usr/lib"