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)