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

26

当我们将Oracle JDK-8迁移到Open JDK-11时,Apache POI生成Excel存在问题

已尝试 -Djava.awt.headless=true

org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1053)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:998)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:901)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:875)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)```

1
https://javarevisited.blogspot.com/2011/06/noclassdeffounderror-exception-in.html - silfrede
我们正在使用OpenJDK,无法回到Oracle JDK。 - PCB
4个回答

58
如果您正在使用openjdk的'slim镜像',则该镜像不再包括'fontconfig'和'libfreetype6'软件包。
检查openjdk:11-slim的docker文件和openjdk:8-slim的docker文件之间的差异。
您可以选择另一个docker镜像(例如openjdk:11-windowsservercore),或在您的docker文件中自行安装这些软件包:
RUN apt-get update && apt-get install -y fontconfig libfreetype6 && rm -rf /var/lib/apt/lists/*

1
这应该是被接受的答案。当使用“tomcat:9-jdk11-openjdk-slim”镜像时,它可以完美地工作。 - matsa
1
在 Docker 文件中,将 "FROM library/openjdk:8-jdk-slim" 更新为 "FROM openjdk:8u232-jdk" 解决了我的问题。谢谢! - Doga Ozdemir
如果我使用的是Alpine版本怎么办?在Alpine中没有libfreetype6。我尝试了freetype,但它不起作用... - Den B
@DenB 对于Alpine,我没有找到其他方法,只能安装libgcc(我还添加了可选的兼容性包来弥补我的过失):apk add freetype-dev libgcc libc6-compat gcompat。 - lpa
2
为了最小化Docker层的大小,您可能希望在完成apt-get install步骤后删除apt-get update临时文件。您可以通过附加&& rm -rf /var/lib/apt/lists/*来实现这一点。此外,使用&&连接命令而不是;是有意义的,因为如果更新步骤出现任何问题,您可能希望尽早失败。 - Daniel Stevens
需要将此项添加到使用 openjdk:8-jre-slim 的项目中,这里的建议是有效的。注意:如果使用多阶段 Docker 构建,请务必在正确的阶段添加此项。 - muya_

3

问题的根本原因是其他地方。

我刚刚创建了一个简单的类,它加载X11FontManager,但当我运行它时,它报错了。

unable to link "libfreetype6"

我曾经使用以下方式安装它:

apt-get install libfreetype6

开始时出现了“无法链接libfontconfig1.so”错误

apt-get install libfontconfig1

修复了这个问题

阅读此文并理解了一些内容 https://medium.com/azulsystems/using-jlink-to-build-java-runtimes-for-non-modular-applications-9568c5e70ef4


1

当您在alpine版本中使用openjdk docker镜像时,例如:adoptopenjdk/openjdk11:jre-11.0.11_9-alpine,会出现问题。

您需要将镜像更改为完整版本:adoptopenjdk/openjdk11:jre-11.0.11_9


0
2021-06-23 03:44:37.950  INFO 1 --- [       Thread-7] ReportService   : Template path : /jasper/MgmtSummary.jrxml
Exception in thread "Thread-7" java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:398)

在使用 Docker 镜像 gcr.io/distroless/java-debian10:11 时,我遇到了上述错误。

当我将镜像更改为 adoptopenjdk/openjdk11 后,问题得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接