首页 > 解决方案 > 尝试使用 ImageIO.read 读取 PNG 图像时,在 Tomcat 8 服务器中获取 java.lang.NoClassDefFoundError: com/sun/medialib/codec/png/Decoder

问题描述

在我的 Tomcat 8 服务器的最近部署中,当我尝试使用 ImageIO.read() 将 PNG 图像读取为 InputStream 时出现以下错误,如下所示:

InputStream imageInput = storageResource.getData();
BufferedImage originalImage = ImageIO.read(imageInput);

错误:

javax.imageio.IIOException: codecLib error
        at com.sun.media.imageioimpl.plugins.png.CLibPNGImageReader.decode(CLibPNGImageReader.java:78)
        at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.getImage(CLibImageReader.java:497)
        at com.sun.media.imageioimpl.plugins.png.CLibPNGImageReader.getImageTypes(CLibPNGImageReader.java:117)
        at javax.imageio.ImageReader.getRawImageType(ImageReader.java:681)
        at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.read(CLibImageReader.java:571)
        at javax.imageio.ImageIO.read(ImageIO.java:1448)
        at javax.imageio.ImageIO.read(ImageIO.java:1352)
        at com.media.entra.publication.image.PlatformImageUrlHandler.getImageCreationDescriptor(PlatformImageUrlHandler.java:272)
        at com.media.entra.publication.image.PlatformImageUrlHandler.parseImageUrl(PlatformImageUrlHandler.java:208)
        at de.think.image.ImageProcessor.doBefore(ImageProcessor.java:80)
        at com.scened.presentation.servlet.ProcessorFilter.doFilterImpl(ProcessorFilter.java:74)
        at com.twelvemonkeys.servlet.GenericFilter.doFilter(GenericFilter.java:206)
        at com.scened.presentation.servlet.LooseFilterChain$Chain.doFilter(LooseFilterChain.java:153)
        at com.scened.presentation.servlet.ProcessorFilter.doFilterImpl(ProcessorFilter.java:76)
        at com.twelvemonkeys.servlet.GenericFilter.doFilter(GenericFilter.java:206)
        at com.scened.presentation.servlet.LooseFilterChain$Chain.doFilter(LooseFilterChain.java:153)
        at com.scened.presentation.servlet.ProcessorFilter.doFilterImpl(ProcessorFilter.java:76)
        at com.twelvemonkeys.servlet.GenericFilter.doFilter(GenericFilter.java:206)
        at com.scened.presentation.servlet.LooseFilterChain$Chain.doFilter(LooseFilterChain.java:153)
        at com.scened.presentation.servlet.LooseFilterChain.filter(LooseFilterChain.java:69)
        at com.scened.presentation.servlet.CompositeFilter.doFilterImpl(CompositeFilter.java:36)
        at com.twelvemonkeys.servlet.GenericFilter.doFilter(GenericFilter.java:206)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
        at com.scened.presentation.servlet.BootstrapFilter.doFilterImpl(BootstrapFilter.java:81)
        at com.twelvemonkeys.servlet.GenericFilter.doFilter(GenericFilter.java:206)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
        at com.googlecode.psiprobe.Tomcat80AgentValve.invoke(Tomcat80AgentValve.java:41)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458)
        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)
Caused by: java.lang.NoClassDefFoundError: com/sun/medialib/codec/png/Decoder
        at com.sun.media.imageioimpl.plugins.png.CLibPNGImageReader.decode(CLibPNGImageReader.java:75)
        ... 44 more

问题似乎出在这个源自 jai-imageio-core 的 CLibPNGImageReader.java 文件中。我检查了我的 lib 文件夹,似乎我有这个 JAR(jai_imageio-1.1.jar & 还有 jai_core-1.1.3.jar & jai_codec-1.1.3.jar)。我必须指出,我不直接导入 jai 包,它们可能是 javax.imageio.ImageIO 的依赖项。

有没有办法找到这个问题的原因?

标签: javatomcattomcat8javax.imageio

解决方案


推荐阅读