![](/img/trans.png)
[英]No .class file in the jar when adding a META-INF/services directory
[英]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.