0

程序在我使用Java 6时运行良好,但切换到Java 7后出现错误。相同的图像文件已用于测试,因此可能不是图像格式的问题。

部分代码:(ImageIO.write行发生错误)

try {
        ImageIO.write(bimage, format, bstream);
        bstream.close();
        return bstream.toByteArray();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

错误:

java.util.ServiceConfigurationError: javax.imageio.spi.ImageReaderSpi: Provider com.slb.imageio.plugins.wsq.writer.WSQImageWriterSpi not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:231)
at java.util.ServiceLoader.access$300(ServiceLoader.java:181)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:369)
at java.util.ServiceLoader$1.next(ServiceLoader.java:445)
at javax.imageio.spi.IIORegistry$1.run(IIORegistry.java:241)
at java.security.AccessController.doPrivileged(Native Method)
at javax.imageio.spi.IIORegistry.registerInstalledProviders(IIORegistry.java:249)
at javax.imageio.spi.IIORegistry.registerStandardSpis(IIORegistry.java:184)
at javax.imageio.spi.IIORegistry.<init>(IIORegistry.java:137)
at javax.imageio.spi.IIORegistry.getDefaultInstance(IIORegistry.java:159)
at javax.imageio.ImageIO.<clinit>(ImageIO.java:65)

不仅 ImageIO.write(),其他 ImageIO 方法也不能正常工作,例如:

JPEGImageWriter imageWriter = (JPEGImageWriter)ImageIO.getImageWritersBySuffix("jpeg").next();
        ImageOutputStream ios = ImageIO.createImageOutputStream(out);

我尝试搜索类似的错误,但没有找到解决方案。谁能帮我这个?谢谢

4

1 回答 1

2

该异常是由您安装的 ImageIO 插件引起的。

问题是提供者类com.slb.imageio.plugins.wsq.writer.WSQImageWriterSpi注册在一个名为/META-INF/services/javax.imageio.spi.ImageReaderSpi(通常在 JAR 中)的资源中。这是不正确的。

它应该在/META-INF/services/javax.imageio.spi.ImageWriterSpi.

从堆栈跟踪中可以看出,异常发生在ImageIO类初始化 ( <clinit>) 中。这很关键,也是大多数/所有ImageIO方法在发生这种情况后都会失败的原因。Java 6 的实现可能对此很宽容,并将提供者注册为ImageWriterSpi不管(或简单地忽略它),而 Java 7 的实现则更为严格。错误一直存在,只是之前没有表现出来。

要解决此问题,请联系供应商并请求修复,或者更新 JAR 文件并将正确的文件放入/META-INF/services/. 如果您不需要失败的插件,当然您可以从类路径中删除包含该插件的 JAR。

于 2013-10-02T07:18:01.897 回答