I'm trying to move a tomcat server that was run on a CentOS 7 operating system into a docker container. However, I got Could not initialize class javax.imageio.ImageIO error after moving it into the docker container.
Here is an ant project that creates a helloworld.war file for reproducing my problem.
I've tried the following tomcat docker tags in dockerhub, but all of them create the ImageIO error.
- 8-jdk8
- 8.5.43-jdk13-openjdk-oracle
- 8.5.43-jdk8-adoptopenjdk-hotspot
- 7.0.94-jre8
- 7.0.96-jdk8-openjdk
- 8.5.43-jdk13-openjdk-oracle
The tomcat installed by yum install tomcat on my CentOS 7 doesn't have the ImageIO error.
Why does this happen?
The java and tomcat version on my CentOS 7 are
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)
and
Apache Tomcat/7.0.76
Another fact that I found is setting JAVA_OPTS as "-Djava.awt.headless=true" instead of "-Djava.awt.headless=true -server" can avoid the problem.
Is it possible to run the tomcat service in a docker container with JAVA_OPTS="-Djava.awt.headless=true -server" and without Could not initialize class javax.imageio.ImageIO error?
The way I pass value to JAVA_OPTS is by setting 
environment:
    - JAVA_OPTS="-Djava.awt.headless=true -server"`
in the docker-compose.yml file
I've run ps aux | grep java to verify that the java program inside the docker container has java.awt.headless value set.
This post says you can set JAVA_OPTS="-Djava.awt.headless=true -Dawt.toolkit=sun.awt.HToolkit" to avoid Could not initialize class javax.imageio.ImageIO problem.
The full log is as the following:
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)

 
    