javax.imageio.IIOException:无法在 Tomcat 9、OpenJDK 11 和 Geoserver 中创建 ImageInputStream
Posted
技术标签:
【中文标题】javax.imageio.IIOException:无法在 Tomcat 9、OpenJDK 11 和 Geoserver 中创建 ImageInputStream【英文标题】:javax.imageio.IIOException: Can't create an ImageInputStream in Tomcat 9, OpenJDK 11 and Geoserver 【发布时间】:2019-03-05 13:55:09 【问题描述】:在处理 javax.imageio.IIOException: Can't create an ImageInputStream! after call ImageIO.read(File file) because of a missing FileImageInputStreamSpi 提供程序 我认识到我的 webapp 中可用的 ImageIO 服务提供程序取决于 Geoserver (http://geoserver.org) webapp 是否在同一个 Tomcat Web 容器中运行:
只有我的网络应用在运行:
从 RandomAccessFile 实例化 FileImageInputStream 的服务提供者 从文件实例化 FileImageInputStream 的服务提供者 从 InputStream 实例化 FileCacheImageInputStream 或 MemoryCacheImageInputStream 的服务提供者我的 webapp 沿着 Geoserver 2.15.0 webapp 运行:
NIO 通道 ImageInputStream 包装 FileImageInputStream 的服务提供者 帮助连接到字符串指向的对象的服务提供者 帮助连接到 URL 指向的对象的服务提供者 从 RandomAccessFile 实例化 FileImageInputStream 的服务提供者我的 webapp 中的代码:
IIORegistry reg = IIORegistry.getDefaultInstance();
Iterator<ImageInputStreamSpi> it = reg.getServiceProviders(ImageInputStreamSpi.class, true);
while (it.hasNext())
ImageInputStreamSpi spi = it.next();
System.out.println(spi.getDescription(Locale.GERMAN));
我正在使用 Tomcat 9.0.16 webapp 和 OpenJDK 11。
我想知道为什么两个 web 应用程序都可能以这种方式干扰 - 这实际上不是一个安全问题吗?
感谢您的一般性澄清。
【问题讨论】:
【参考方案1】:这是ImageIO
和IIORegistry
的已知问题。注册表实例在 VM 上的所有应用程序之间共享。这通常会导致问题,就像你的情况一样。
我在 TwelveMonkeys ImageIO 项目的自述文件中写了一些关于 Deploying ImageIO plugins in a Web App 的内容。使用上下文侦听器可能有助于解决一些问题,但不能解决根本问题。
另一个解决方法是仅将 ImageIO 插件部署为服务器本身的一部分(即共享 lib 文件夹),以确保所有 Web 应用程序看到相同的插件。
如果您深入查看IIORegistry
的源代码,您会发现它实际上支持多个注册表,但这些都与AppContext
s 相关联(由applet、webstart 等使用),不幸的是与 Web 应用程序上下文不同。看起来应该可以让网络上下文也有不同的AppContext
s,只要他们使用不同的ThreadGroup
s。但是我从来没有找到一种方法让应用服务器为每个 Web 应用程序上下文分配不同的线程组。
【讨论】:
感谢您快速而有价值的回答!我自己不部署任何 ImageIO 插件,我只想使用它们。但显然,Geoserver 确实部署了一些。我不确定 Geoserver 团队是否意识到您提到的干扰 - 也许值得提交一个错误,包括指向您提出的 ContextListener 解决方法的链接? @user27772 我想这不会有什么坏处。 :-) 如果是问题就运行两个tomcats以上是关于javax.imageio.IIOException:无法在 Tomcat 9、OpenJDK 11 和 Geoserver 中创建 ImageInputStream的主要内容,如果未能解决你的问题,请参考以下文章