切换到Java 7后,ImageIO方法无法正常工作

时间:2013-10-02 03:51:57

标签: java-7 javax.imageio

当我使用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);

我尝试过搜索类似错误,但未找到解决方法。 谁能帮我这个?感谢

1 个答案:

答案 0 :(得分: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。