javax.imageio.IIOException:无法在Tomcat 9,OpenJDK 11和Geoserver中创建ImageInputStream

时间:2019-03-05 13:55:09

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

在处理 javax.imageio.IIOException时:由于缺少而无法在调用 ImageIO.read(File file)后创建ImageInputStream!。 FileImageInputStreamSpi 提供程序我认识到Web应用程序中可用的 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的服务提供商

我的网络应用程序中的代码:

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 个答案:

答案 0 :(得分:4)

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

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

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


如果您深入研究IIORegistry的源代码,您会发现它实际上对多个注册表具有一定的支持,但是它们与AppContext绑定(由applet,webstart等使用) ,不幸的是,它与Web应用程序上下文不同。如果仅使用不同的AppContext,似乎也可以使Web上下文也具有不同的ThreadGroup。但是我从未找到一种方法来使应用服务器为每个Web应用程序上下文分配不同的线程组。