【问题标题】:JAI vendorname == null (standard solution doesn't work)JAI vendorname == null(标准解决方案不起作用)
【发布时间】:2014-08-05 18:54:04
【问题描述】:

在使用ImageIO 时,我得到了这个java.util.ServiceConfigurationError

javax.imageio.spi.ImageInputStreamSpi: Provider com.sun.media.imageioimpl.stream.ChannelImageInputStreamSpi could not be instantiated caused by: java.lang.IllegalArgumentException: vendorName == null!.

我尝试this 来解决我的问题,但没有帮助。我在jai_imageio.jar 中的MANIFEST.MF 包含所有必需的信息:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.2
Created-By: 1.4.2_12-b03 (Sun Microsystems Inc.)
Specification-Title: Java Advanced Imaging Image I/O ToolsSun Microsystems, Inc.
Implementation-Title: com.sun.media.imageio
Implementation-Version: 1.1
Specification-Version: 1.1
Implementation-Vendor: Sun Microsystems, Inc.
Extension-Name: com.sun.media.imageio
Sealed: true

重要 - 只有当我在没有 Eclipse 的情况下将程序作为导出的可运行 jar 文件运行时才会发生此错误。当我使用 Eclipse 运行时,一切正常。

【问题讨论】:

标签: java eclipse javax.imageio jai


【解决方案1】:

我知道它很旧,并且在 SO 上被问过很多次,但我遇到了同样的问题,标准解决方案也对我不起作用,所以我选择了这个来分享我的解决方案。我的清单中有所有属性(包括Specification-Vendor,它在 OP 的 sn-p 中缺失)但 AWS EMR 集群上的 Hadoop RunJar 类似乎解压了 jar,因此清单被忽略了(我真的没有更深入地调查)。 我最终得到了一个使用反射的解决方案:

public static void tweakPackageUtil (Class<?> packageUtilClass, String vendor, String version, String specTitle) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
{
    Field vendorField = packageUtilClass.getDeclaredField("vendor");
    vendorField.setAccessible(true);
    vendorField.set(null, vendor);

    Field versionField = packageUtilClass.getDeclaredField("version");
    versionField.setAccessible(true);
    versionField.set(null, version);

    Field specTitleField = packageUtilClass.getDeclaredField("specTitle");
    specTitleField.setAccessible(true);
    specTitleField.set(null, specTitle);
}

并为所有 PackageUtil 类调用此方法 - 以我为例:

com.sun.media.imageioimpl.common.PackageUtil.class,
io.scif.media.imageioimpl.common.PackageUtil.class,                                                                            
com.github.jaiimageio.impl.common.PackageUtil.class

vendorversionspecType 的确切值并不重要,只要它们不是 null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多