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

Pur*_*rna 15 java awt apache-poi

当我们从 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)```
Run Code Online (Sandbox Code Playgroud)

R. *_*olt 28

如果您使用的是 openjdk 的 docker ' slim images',则该图像不再包含包 '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 
Run Code Online (Sandbox Code Playgroud)

  • 为了最大限度地减少 Docker 层的大小,您可能需要在完成“apt-get install”步骤后删除“apt-get update”临时文件。您可以通过附加 `&& rm -rf /var/lib/apt/lists/*` 来做到这一点。此外,使用“&&”而不是“;”连接命令是有意义的,因为如果更新步骤出现任何问题,您可能希望尽早失败。 (3认同)
  • 这应该是公认的答案。当使用“tomcat:9-jdk11-openjdk-slim”图像时,这非常有效。 (2认同)
  • 在 docker 文件中,将“FROM library/openjdk:8-jdk-slim”更新为“FROM openjdk:8u232-jdk”解决了我的问题。谢谢你! (2认同)