3

背景:在我的项目中,我必须从网络上获取图像并在存储之前调整它们的大小。为此,我使用 imgscalr 来调整图片大小,它使用 Java 的 ImageIO API。

问题是 ImageIO API 似乎不支持 JPEG 的 CMYK 颜色空间,因此它无法读取从我们的数据提供者获取的一些图片(我无法更改图片格式)。

为了添加对 CMYK 的支持,我找到了一个不错的 lib(我试图将其打包为 maven 工件并进行一些增强),它是一个 ImageReaderSpi 扩展。

到现在为止还挺好。我面临的问题是 ImageIO API 似乎没有加载扩展,它的行为就好像它不存在一样。

我创建了一个 Maven 工件,它是一个简单的 jar,其中包含扩展实现和META-INF/services/javax.imageio.spi.ImageReaderSpi包含实现 Spi 的类的名称的文件。

我确定 jar 在类路径中,因为我在其中使用了一个帮助程序并且它被找到了。

作为记录,我正在将项目(WAR)部署到 Tomcat 中,扩展 jar 位于WEB-INF/lib文件夹中。

jar 源代码可在此处获得 META-INF 文件包含在 maven 构建期间(@MetaInfServices 注释执行此操作)。

我被困在这里,我认为我做对了,这就是为什么我在寻求你的帮助!

4

1 回答 1

1

使用从 WEB-INF/lib 加载的 ImageIO 插件存在一些潜在的缺陷,这是由于ClassLoaderWeb 容器中的层次结构(正如 @MadProgrammer 在评论部分中提到的那样)。将插件添加到 Web 容器共享库文件夹(或类路径)通常是最好和最简单的方法。

如果您出于某种原因需要将插件捆绑在您的应用程序中,则需要ImageIO.scanForPlugins()从 Web 应用程序的某个位置调用。

这将使插件可用,但会引入资源/内存泄漏(重新部署 Web 应用程序后插件会留在内存中)。

请参阅我在线程How to resolve OutOfMemoryError with ImageIO plugins as the cause 中的回答?用于分析和解决这两个问题。

于 2013-08-09T07:26:14.200 回答