【问题标题】:NoClassDefFoundError: Could not initialize class sun.awt.X11FontManagerNoClassDefFoundError:无法初始化类 sun.awt.X11FontManager
【发布时间】:2019-08-22 13:19:51
【问题描述】:

当我们从 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)```

【问题讨论】:

标签: java apache-poi awt


【解决方案1】:

如果您使用的是 openjdk 的 docker 'slim images',则该映像不再包含包“fontconfig”和“libfreetype6”。

检查 openjdk:11-slim 的 docker file 和 openjdk:8-slim 的 docker file 的区别。

您可以选择另一个 docker 映像(例如 openjdk:11-windowsservercore),或者自己在 docker 文件中安装软件包:

RUN apt-get update; apt-get install -y fontconfig libfreetype6 

【讨论】:

  • 这应该是公认的答案。这在使用 'tomcat:9-jdk11-openjdk-slim' 图像时非常有效。
  • 在 docker 文件中,将“FROM library/openjdk:8-jdk-slim”更新为“FROM openjdk:8u232-jdk”解决了我的问题。谢谢!
【解决方案2】:

根本问题是别的东西

我刚刚创建了一个简单的类,它执行 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

【讨论】:

    【解决方案3】:

    alpine 版本中使用 openjdk docker 镜像时会出现问题,例如:

    adoptopenjdk/openjdk11:jre-11.0.11_9-alpine

    你需要chenge图片到完整版:adoptopenjdk/openjdk11:jre-11.0.11_9

    【讨论】:

      【解决方案4】:
      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 image gcr.io/distroless/java-debian10:11 时遇到上述错误

      当我将图像更改为adoptopenjdk/openjdk11时,此问题已得到修复

      【讨论】:

        猜你喜欢
        • 2022-06-23
        • 1970-01-01
        • 2013-10-27
        • 2014-12-05
        • 2019-11-28
        • 2017-02-28
        • 2016-09-03
        • 2017-06-29
        • 1970-01-01
        相关资源
        最近更新 更多