背景:在我的项目中,我必须从网络上获取图像并在存储之前调整它们的大小。为此,我使用imgscalr来调整图片的大小,使用Java的ImageIO API。
问题是ImageIO API似乎不支持JPEG的CMYK色彩空间,因此无法读取从我们的数据提供者处获取的一些图片(我无法更改图片格式)。
为了添加对CMYK的支持,我发现了一个很好的lib(我试图将其打包为maven工件并增强一点),这是一个ImageReaderSpi扩展。
到目前为止,这么好。我面临的问题是ImageIO API似乎没有加载扩展,它就好像它不存在一样。
我创建了一个maven工件,它是一个包含扩展实现的简单jar,以及包含实现Spi的类名称的META-INF/services/javax.imageio.spi.ImageReaderSpi
文件。
我确信jar是在类路径中,因为我正在使用一个帮助器并且找到它。
为了记录,我正在将项目(WAR)部署到Tomcat中,扩展jar位于WEB-INF/lib
文件夹中。
jar源代码是available here,在maven构建期间包含了META-INF文件(@MetaInfServices注释就是这样做的。)
我被困在这里,我认为我做得对,这就是为什么我在寻求你的帮助!
答案 0 :(得分:2)
由于Web容器中的ClassLoader
层次结构(如评论部分中的@MadProgrammer所述),使用从WEB-INF / lib加载的ImageIO插件存在一些潜在的缺陷。将插件添加到Web容器共享libs文件夹(或类路径)通常是最好和最简单的方法。
如果您出于某种原因需要在应用中捆绑插件,则需要从网络应用中的某个位置拨打ImageIO.scanForPlugins()
。
这将使插件可用,但会引入资源/内存泄漏(在重新部署Web应用程序后,插件会保留在内存中)。
在线程How to resolve OutOfMemoryError with ImageIO plugins as the cause?中查看我的答案,以便分析和解决这两个问题。