我的Java SPI扩展未加载

我的Java SPI扩展未加载,java,javax.imageio,Java,Javax.imageio,背景:在我的项目中,我必须从网络上获取图像并在存储之前调整它们的大小。为此,我使用imgscalr来调整图片的大小,它使用Java的imageioapi 问题是ImageIO API似乎不支持JPEG的CMYK颜色空间,因此它无法读取从数据提供商获取的一些图片(我无法更改图片格式) 为了增加对CMYK的支持,我找到了一个很好的库(我正试图将其打包为maven工件并稍微增强),它是一个ImageReaderSpi扩展 到目前为止,一切顺利。我面临的问题是,该扩展似乎不是由ImageIO API加载

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

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

为了增加对CMYK的支持,我找到了一个很好的库(我正试图将其打包为maven工件并稍微增强),它是一个ImageReaderSpi扩展

到目前为止,一切顺利。我面临的问题是,该扩展似乎不是由ImageIO API加载的,它的行为就像它不存在一样

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

我确信jar在类路径中,因为我在其中使用了一个助手,并且它被找到了

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

jar源代码是在maven构建过程中包含的META-INF文件(@MetaInfServices注释就是这样做的)


我被困在这里,我认为我做的事情是正确的,这就是为什么我在寻求你的帮助

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

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

这将使插件可用,但会导致资源/内存泄漏(重新部署web应用程序后,插件仍保留在内存中)


有关这两个问题的分析和解决方案,请参见线程中的我的答案。

这可能是类加载器问题。您的SPI可能加载在比系统类加载器更高的类加载器中,因此它无法访问(您只能向下查看层次结构,不能向上查看)。您是否尝试过将包含SPI的Jar添加到Tomcat正在使用的JRE的
ext
文件夹中?当您使用良好的条目等进行部署时,服务文件是否实际存在?例如,你确定它没有被构建过程的另一个步骤覆盖吗?MadProgrammer:我已经尝试过了,但可能我没有在正确的JVM中尝试过,我会重试。fge:文件在那里,这是肯定的。你是否尝试过编写一个小的、独立的Java程序来验证你的JAR/插件是否正常工作和加载(没有与web应用程序相关的问题)?我也尝试将jar放在lib文件夹中,但将重试并添加ImageIO.scanForPlugins()调用。谢谢Harald,似乎问题确实与ClassLoader相关。我使用了您的解决方案。我还发布了我的库,其中包括您的ContextListener。谢谢:)我“刚刚”使用了ContextListener。代码的其余部分取自另一个人:)