Загрузчик службы не находит класс поставщика службы, хотя class находится в том же файле JAR, что и META-INF/services

Я успешно запускаю приложение C++, которое загружает JVM с файлом JAR в качестве аргумента classpath. Затем приложение успешно использует вызовы JNI для выполнения различных функций, определенных в файлах .class в этом файле JAR.

В структуру каталогов файла .jar включен сторонний набор файлов .class — объединенных из jai_imageio.jar (эти файлы .class с их полной структурой каталогов были объединены в один файл .jar с помощью Intellij IDEA). Также в объединенный файл .jar включены строки из исходного файла jai_imageio.jar manifest.mf, в частности имплементация-названиеи связанные строки. Также присутствует папка meta-inf/services, также скопированная из jai_imageio.jar. Различные службы, перечисленные в каталоге services, выглядят правильно.

В частности, javax.imageio.spi.ImageOutputStreamSpiв папке meta-inf/servicesв файле .jar содержит одну строку 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, как указано выше.

Кто-нибудь может объяснить, почему возникает эта ошибка и что мне делать, чтобы ее устранить.

6
задан Dan Nissenbaum 9 May 2012 в 10:50
поделиться