javax.imageio.IIOException:无法在 Tomcat 9、OpenJDK 11 和 Geoserver 中创建 ImageInputStream
javax.imageio.IIOException: Can't create an ImageInputStream in Tomcat 9, OpenJDK 11 and Geoserver
处理 javax.imageio.IIOException 时:无法创建 ImageInputStream! 在调用 ImageIO.read(File file) 因为缺少 FileImageInputStreamSpi 提供程序,我认识到 ImageIO 服务提供程序在我的 webapp 中可用取决于 Geoserver (http://geoserver.org) webapp 运行 是否在同一个 Tomcat 网络容器中:
只有我的网络应用运行:
- 从 RandomAccessFile 实例化 FileImageInputStream 的服务提供者
- 从文件实例化 FileImageInputStream 的服务提供者
- 从 InputStream 实例化 FileCacheImageInputStream 或 MemoryCacheImageInputStream 的服务提供者
我的网络应用 运行 以及 Geoserver 2.15.0 网络应用:
- NIO 通道图像输入流
- 包装 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 应用程序都可能以这种方式进行干扰 - 这实际上不是安全问题吗?
感谢您的一般性说明。
这是 ImageIO
和 IIORegistry
的一个已知问题。注册表实例在 VM 中的所有应用程序之间共享。这通常会导致问题,就像你的情况一样。
我在 TwelveMonkeys ImageIO 项目的自述文件中写了一些关于 Deploying ImageIO plugins in a Web App 的内容。使用上下文侦听器可能有助于解决一些问题,但不能解决根本问题。
另一个修复方法是仅将 ImageIO 插件部署为服务器本身的一部分(即共享库文件夹),以确保所有网络应用程序都能看到相同的插件。
如果深入查看 IIORegistry
的源代码,您会发现它实际上支持多个注册表,但这些与 AppContext
s 相关(由小程序使用,webstart等),不幸的是,这与 Web 应用程序上下文不同。似乎也应该可以使 Web 上下文也具有不同的 AppContext
,只要它们使用不同的 ThreadGroup
。但是我从来没有找到一种方法让应用程序服务器为每个 Web 应用程序上下文分配不同的线程组。
处理 javax.imageio.IIOException 时:无法创建 ImageInputStream! 在调用 ImageIO.read(File file) 因为缺少 FileImageInputStreamSpi 提供程序,我认识到 ImageIO 服务提供程序在我的 webapp 中可用取决于 Geoserver (http://geoserver.org) webapp 运行 是否在同一个 Tomcat 网络容器中:
只有我的网络应用运行:
- 从 RandomAccessFile 实例化 FileImageInputStream 的服务提供者
- 从文件实例化 FileImageInputStream 的服务提供者
- 从 InputStream 实例化 FileCacheImageInputStream 或 MemoryCacheImageInputStream 的服务提供者
我的网络应用 运行 以及 Geoserver 2.15.0 网络应用:
- NIO 通道图像输入流
- 包装 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 应用程序都可能以这种方式进行干扰 - 这实际上不是安全问题吗?
感谢您的一般性说明。
这是 ImageIO
和 IIORegistry
的一个已知问题。注册表实例在 VM 中的所有应用程序之间共享。这通常会导致问题,就像你的情况一样。
我在 TwelveMonkeys ImageIO 项目的自述文件中写了一些关于 Deploying ImageIO plugins in a Web App 的内容。使用上下文侦听器可能有助于解决一些问题,但不能解决根本问题。
另一个修复方法是仅将 ImageIO 插件部署为服务器本身的一部分(即共享库文件夹),以确保所有网络应用程序都能看到相同的插件。
如果深入查看 IIORegistry
的源代码,您会发现它实际上支持多个注册表,但这些与 AppContext
s 相关(由小程序使用,webstart等),不幸的是,这与 Web 应用程序上下文不同。似乎也应该可以使 Web 上下文也具有不同的 AppContext
,只要它们使用不同的 ThreadGroup
。但是我从来没有找到一种方法让应用程序服务器为每个 Web 应用程序上下文分配不同的线程组。