java - Tomcat 服务器在移入 docker 容器后生成 `Could not initialize class javax.imageio.ImageIO` 错误

标签 java docker tomcat

我正在尝试将在 CentOS 7 操作系统上运行的 tomcat 服务器移动到 docker 容器中。但是,将它移入 docker 容器后,我得到了 Could not initialize class javax.imageio.ImageIO 错误。

enter image description here

Here是一个 ant 项目,它创建一个 helloworld.war 文件来重现我的问题。

我在 dockerhub 中尝试了以下 tomcat docker 标签,但它们都会产生 ImageIO 错误。

  • 8-jdk8
  • 8.5.43-jdk13-openjdk-甲骨文
  • 8.5.43-jdk8-adoptopenjdk-热点
  • 7.0.94-jre8
  • 7.0.96-jdk8-openjdk
  • 8.5.43-jdk13-openjdk-甲骨文

在我的CentOS 7上用yum install tomcat安装的tomcat没有出现ImageIO错误。

为什么会这样?

我的CentOS 7上的java和tomcat版本是

openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

Apache Tomcat/7.0.76

我发现的另一个事实是将 JAVA_OPTS 设置为 "-Djava.awt.headless=true" 而不是 "-Djava.awt.headless=true -server" 可以避免这个问题。

是否可以在带有 JAVA_OPTS="-Djava.awt.headless=true -server" 而没有 的 docker 容器中运行 tomcat 服务无法初始化类 javax.imageio。 ImageIO 错误?

我将值传递给 JAVA_OPTS 的方式是设置

environment:
    - JAVA_OPTS="-Djava.awt.headless=true -server"`

docker-compose.yml文件中

我运行了 ps aux | grep java 验证 docker 容器内的 java 程序是否设置了 java.awt.headless 值。

This post说你可以设置 JAVA_OPTS="-Djava.awt.headless=true -Dawt.toolkit=sun.awt.HToolkit" 来避免 Could not initialize class javax.imageio.ImageIO 问题。

完整日志如下:

SEVERE: Servlet.service() for servlet [mypackage.HelloworldServlet] in context with path [/helloworld] threw exception [Servlet execution threw an exception] with root cause
java.lang.NoClassDefFoundError: Could not initialize class javax.imageio.ImageIO
        at mypackage.HelloworldServlet.doGet(Unknown Source)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:444)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1137)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
        at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:2516)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

最佳答案

尝试将 Windows 上的 Tomcat 服务器移动到 docker 容器时,我遇到了同样的问题。 java.awt.headless=true 没有帮助。我可以通过用官方 AdoptOpenJDK 替换 mcr.microsoft.com/windows/servercore docker 图像来解决这个问题。 jetty 图像。

关于java - Tomcat 服务器在移入 docker 容器后生成 `Could not initialize class javax.imageio.ImageIO` 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57387656/

相关文章:

amazon-web-services - 如何在长时间运行的启动脚本中使ECS容器保持事件状态

apache - 302 重定向,Tomcat 落后于 Apache for hybris

java - Android:通过代码获取所有通知

java - 字符串的数字操作

mysql - 从 rstudio docker 内部连接到主机 mysql 数据库

docker - 直接连接两个docker容器

tomcat - 自定义 Realm/从 Netbeans 6.8/第一个 HTTP 请求启动 Tomcat 6.0

tomcat - keytool 错误 : java. lang.Exception:无法从回复建立链

java - Arraylist和Vector的负载因子?

JavaFx 和套接字监听器