繁体   English   中英

即使类与META-INF / services位于同一JAR文件中,服务加载程序也找不到服务提供者类

[英]Service loader does not locate service provider class, even though class is in same JAR file as META-INF/services

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

.jar文件的目录结构中包含第三方.class文件集 - 从jai_imageio.jar合并的文件(这些.class文件及其完整目录结构,使用Intellij IDEA合并到此单个.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 ,并且在其中有一个与之对应的类。 jar文件正好在该行指示的目录中: 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/1.5.0/docs/guide/jni/spec/invocation.html

“当一个线程附加到VM时,上下文类加载器就是引导加载器。”

通过AttachCurrentThread()连接到JVM的任何本机线程只获取引导类加载器,甚至不获取系统类加载器。 除非您明确修复新线程的上下文类加载器,否则ServiceLoader引用的类将不可用。

这可以这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM