【问题标题】:javax.imageio.IIOException: Can't create an ImageInputStream in Tomcat 9, OpenJDK 11 and Geoserverjavax.imageio.IIOException:无法在 Tomcat 9、OpenJDK 11 和 Geoserver 中创建 ImageInputStream
【发布时间】: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 应用程序都可能以这种方式干扰 - 这实际上不是一个安全问题吗?

感谢您的一般性澄清。

【问题讨论】:

    标签: java tomcat geoserver javax.imageio java-11


    【解决方案1】:

    这是ImageIOIIORegistry 的已知问题。注册表实例在 VM 上的所有应用程序之间共享。这通常会导致问题,就像你的情况一样。

    我在 TwelveMonkeys ImageIO 项目的自述文件中写了一些关于 Deploying ImageIO plugins in a Web App 的内容。使用上下文侦听器可能有助于解决一些问题,但不能解决根本问题。

    另一个解决方法是仅将 ImageIO 插件部署为服务器本身的一部分(即共享 lib 文件夹),以确保所有 Web 应用程序看到相同的插件。


    如果您深入查看IIORegistry 的源代码,您会发现它实际上支持多个注册表,但这些都与AppContexts 相关联(由applet、webstart 等使用),不幸的是与 Web 应用程序上下文不同。看起来应该可以让网络上下文也有不同的AppContexts,只要他们使用不同的ThreadGroups。但是我从来没有找到一种方法让应用服务器为每个 Web 应用程序上下文分配不同的线程组。

    【讨论】:

    • 感谢您快速而有价值的回答!我自己不部署任何 ImageIO 插件,我只想使用它们。但显然,Geoserver 确实部署了一些。我不确定 Geoserver 团队是否意识到您提到的干扰 - 也许值得提交一个错误,包括指向您提出的 ContextListener 解决方法的链接?
    • @user27772 我想这不会有什么坏处。 :-)
    • 如果是问题就运行两个tomcats
    猜你喜欢
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2019-02-27
    相关资源
    最近更新 更多