需要有关应用程序的 Docker 化版本中的错误的帮助

问题描述 投票:0回答:2

我目前正在开发一个应用程序,该应用程序使用基于 Java 17 的基于 Spring Boot 的后端。我使用 Maven 作为构建工具。前端是一个基于ReactJS的应用程序。

在我的开发环境中,我使用 Oracle JDK java 17.0.4。当我构建并执行此应用程序的报告功能时,它按预期工作。

但是,当在 Docker 化环境中为一个 Excel 报告下载场景检查相同功能时,会失败并出现错误。后端日志显示了下面简要提到的一些错误。

遇到的错误信息是与libfontmanager.so库及其依赖项libfreetype.so.6相关的Java UnsatisfiedLinkError。当 Java 无法加载 Java 字体系统运行所需的本机库 (libfreetype.so.6) 时,似乎会发生此错误。

如何在 Docker 环境中解决此问题?使用的 docker 文件或 Java 版本是否需要更改?

相关docker文件

# === Stage 1: Build the Spring Boot app ===
FROM maven:3.6.3-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src/ /app/src/
RUN mvn package -DskipTests
# === Stage 2: Create the final Docker image ===
FROM openjdk:17-alpine
WORKDIR /app
COPY --from=build /app/target/backend-0.0.1-SNAPSHOT.jar app.jar
# Set environment variables for MySQL configuration
ENV MYSQL_HOST=localhost
ENV MYSQL_PORT=****** //Omitted
ENV MYSQL_DATABASE=db
ENV MYSQL_USERNAME=****** //Omitted
ENV MYSQL_PASSWORD=************ //Omitted
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]

下面列出了简短的设置错误消息。

2023-10-05T07:19:23.875Z 错误 1 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : servlet [dispatcherServlet] 的 Servlet.service()路径 [] 的上下文抛出异常 [处理程序调度失败:java.lang.UnsatisfiedLinkError:/opt/openjdk-17/lib/libfontmanager.so:加载共享库 libfreetype.so.6 时出错:没有这样的文件或目录(/ 需要) opt/openjdk-17/lib/libfontmanager.so)] 的根本原因

java.lang.UnsatisfiedLinkError:/opt/openjdk-17/lib/libfontmanager.so:加载共享库 libfreetype.so.6 时出错:没有这样的文件或目录(/opt/openjdk-17/lib/libfontmanager 需要)。所以)

at java.base/jdk.internal.loader.NativeLibraries.load(Native Method) ~[na:na]
at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:383) ~[na:na]
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:227) ~[na:na]
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:169) ~[na:na]
at java.base/jdk.internal.loader.NativeLibraries.findFromPaths(NativeLibraries.java:310) ~[na:na]
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:280) ~[na:na]
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2392) ~[na:na]
at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:808) ~[na:na]
at java.base/java.lang.System.loadLibrary(System.java:1893) ~[na:na]
at java.desktop/sun.font.FontManagerNativeLibrary$1.run(FontManagerNativeLibrary.java:57) ~[na:na]
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312) ~[na:na]
at java.desktop/sun.font.FontManagerNativeLibrary.<clinit>(FontManagerNativeLibrary.java:32) ~[na:na]
at java.desktop/sun.font.SunFontManager$1.run(SunFontManager.java:270) ~[na:na]
at java.desktop/sun.font.SunFontManager$1.run(SunFontManager.java:268) ~[na:na]
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312) ~[na:na]
at java.desktop/sun.font.SunFontManager.<clinit>(SunFontManager.java:268) ~[na:na]
at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
at java.base/java.lang.Class.forName(Class.java:466) ~[na:na]
at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:82) ~[na:na]
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312) ~[na:na]
at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) ~[na:na]
at java.desktop/java.awt.Font.getFont2D(Font.java:526) ~[na:na]
at java.desktop/java.awt.Font.canDisplayUpTo(Font.java:2279) ~[na:na]
at java.desktop/java.awt.font.TextLayout.singleFont(TextLayout.java:469) ~[na:na]
at java.desktop/java.awt.font.TextLayout.<init>(TextLayout.java:530) ~[na:na]
at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:285) ~[poi-5.0.0.jar!/:5.0.0]
at org.apache.poi.ss.util.SheetUtil.getColumnWidth(SheetUtil.java:259) ~[poi-5.0.0.jar!/:5.0.0]
at org.apache.poi.ss.util.SheetUtil.getColumnWidth(SheetUtil.java:244) ~[poi-5.0.0.jar!/:5.0.0]
at org.apache.poi.xssf.usermodel.XSSFSheet.autoSizeColumn(XSSFSheet.java:523) ~[poi-ooxml-5.0.0.jar!/:5.0.0]
at org.apache.poi.xssf.usermodel.XSSFSheet.autoSizeColumn(XSSFSheet.java:505) ~[poi-ooxml-5.0.0.jar!/:5.0.0]
at com.antarctica21.backend.forecasting.service.PlanService.saveWOSRZipExcelFile(PlanService.java:3352) ~[classes!/:0.0.1-SNAPSHOT]
at com.antarctica21.backend.forecasting.service.PlanService.getWeekOversSalesExcelDetails(PlanService.java:3244) ~[classes!/:0.0.1-SNAPSHOT] 

java.lang.NoClassDefFoundError:无法初始化类 sun.awt.X11FontManager

at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
at java.base/java.lang.Class.forName(Class.java:466) ~[na:na]
at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:82) ~[na:na]
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312) ~[na:na]
at java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74) ~[na:na]
at java.desktop/java.awt.Font.getFont2D(Font.java:526) ~[na:na]
at java.desktop/java.awt.Font.canDisplayUpTo(Font.java:2279) ~[na:na]
at java.desktop/java.awt.font.TextLayout.singleFont(TextLayout.java:469) ~[na:na]
at java.desktop/java.awt.font.TextLayout.<init>(TextLayout.java:530) ~[na:na]
at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:285) ~[poi-5.0.0.jar!/:5.0.0]
at org.apache.poi.ss.util.SheetUtil.getColumnWidth(SheetUtil.java:259) ~[poi-5.0.0.jar!/:5.0.0]
at org.apache.poi.ss.util.SheetUtil.getColumnWidth(SheetUtil.java:244) ~[poi-5.0.0.jar!/:5.0.0]
at org.apache.poi.xssf.usermodel.XSSFSheet.autoSizeColumn(XSSFSheet.java:523) ~[poi-ooxml-5.0.0.jar!/:5.0.0]
at org.apache.poi.xssf.usermodel.XSSFSheet.autoSizeColumn(XSSFSheet.java:505) ~[poi-ooxml-5.0.0.jar!/:5.0.0]
at com.antarctica21.backend.forecasting.service.PlanService.saveWOSRZipExcelFile(PlanService.java:3352) ~[classes!/:0.0.1-SNAPSHOT]
at com.antarctica21.backend.forecasting.service.PlanService.getWeekOversSalesExcelDetails(PlanService.java:3244) ~[classes!/:0.0.1-SNAPSHOT]
at com.antarctica21.backend.forecasting.service.PlanService.getWeekOversSalesExcelDetilsByCriteria(PlanService.java:541) ~[classes!/:0.0.1-SNAPSHOT]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) ~[spring-aop-6.0.7.jar!/:6.0.7]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) ~[spring-aop-6.0.7.jar!/:6.0.7]
at com.antarctica21.backend.forecasting.service.PlanService$$SpringCGLIB$$0.getWeekOversSalesExcelDetilsByCriteria(<generated>) ~[classes!/:0.0.1-SNAPSHOT]
at com.antarctica21.backend.forecasting.controller.PlanController.getWeekOversSalesExcelDetilsByCriteria(PlanController.java:190) ~[classes!/:0.0.1-SNAPSHOT]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
java docker apache-poi
2个回答
2
投票

根据 this page,要在 Alpine 中安装

libfreetype.so.6
,您需要
freetype
软件包:

RUN apk add --no-cache freetype

我还会更改基本映像:

openjdk:17-alpine
属于已弃用的
openjdk
存储库,此外,您的
Dockerfile
表明JRE映像对您来说就足够了。您可以使用
eclipse-temurin:17-jre-alpine
或更小但非官方的
pnavato/amazoncorretto-jre:17-alpine


1
投票

根据搜索错误,您需要在容器中安装字体包。

由于 Docker 不是桌面环境,因此 JDK 不需要用于 GUI 相关应用程序,例如处理 Excel 文件和其中的字体

例如,在 Debian/Ubuntu 映像上

RUN apt-get update -y \
  && apt-get install -y libfontconfig1

或者在阿尔卑斯山

RUN apk add --no-cache fontconfig 

此外,您使用的 POI 版本已经有 2 年多了,在 Java 17 发布之前。也许升级一下,现在有可用的修复程序

© www.soinside.com 2019 - 2024. All rights reserved.