服务加载程序未找到服务提供商类,即使类与Meta-Inf/Services同一JAR文件

 2023-01-19    391  

问题描述

我成功地运行了一个C ++应用程序,该应用程序将JVM加载为JAR文件作为classPath参数.然后,该应用程序成功使用JNI调用来执行此JAR文件中的.class文件中定义的各种函数.

.jar文件的目录结构中包含的

服务加载程序未找到服务提供商类,即使类与Meta-Inf/Services同一JAR文件

是第三方的.class文件 – 从jai_imageio.jar合并的文件(这些.class文件及其完整的目录结构已使用Intellijij合并到此.JAR文件中主意).合并.jar文件中还包括原始的jai_imageio.jar的manifest.mf – 特别是implementation-title和相关行中的行.另外,存在meta-inf/services文件夹,也从jai_imageio.jar复制. services目录中列出的各种服务看起来正确.

尤其是,.jar文件中的meta-inf/services文件夹中的javax.imageio.spi.ImageOutputStreamSpi包含单行com.sun.media.imageioimpl.stream.ChannelImageOutputStreamSpi,并且在该行恰好指示的目录: com/sun/media/imageioimpl/stream/ChannelImageOutputStreamSpi.class.

但是,当Java代码执行以下行时:

ImageIO.write(image, "tiff", file); // Assume 'image' is a BufferedImage and 'file' is a File

…它引发异常:

java.util.ServiceConfigurationError: javax.imageio.spi.ImageOutputStreamSpi:
Provider com.sun.media.imageioimpl.stream.ChannelImageOutputStreamSpi not found

…即使此类 在同一.jar文件中存在,如上所述.

有人可以解释为什么会发生此错误以及我应该做些什么来解决它.

推荐答案

来自此文档
http://docs.oracle.com/javase/javase/1.5.0/docs/guide/jni/spec/invocation.html

“当将线程连接到VM时,上下文类加载程序是引导加载程序.”

通过actactcurrentthread()连接到JVM的任何本机线程仅获取Bootstrap类加载程序,甚至没有系统类加载程序.除非您明确修复新线程的上下文类加载程序,否则ServicEloDoder引用的类将不可用.

这可以像:

一样完成

java.lang.Thread.currentThread().setContextClassLoader(
    java.lang.ClassLoader.getSystemClassLoader()
);

以上所述是小编给大家介绍的服务加载程序未找到服务提供商类,即使类与Meta-Inf/Services同一JAR文件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25889.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。