2013-08-09 3 views
3

Фон: В моем проекте я должен получать изображения из Интернета и изменять их размер перед хранением. Для этого я использую imgscalr для изменения размеров изображений, в которых используется API-интерфейс ImageIO Java.My Java SPI extension не загружен

Дело в том, что API ImageIO, похоже, не поддерживает цветовое пространство CMYK для JPEG, поэтому ему не удается прочитать некоторые снимки, полученные от нашего поставщика данных (я не могу изменить формат изображения).

Чтобы добавить поддержку CMYK, я нашел хорошую lib (которую я пытаюсь упаковать как артефакт maven и немного увеличиваю), который является расширением ImageReaderSpi.

До сих пор так хорошо. Проблема, с которой я сталкиваюсь, заключается в том, что расширение, похоже, не загружается API ImageIO, оно действует так, как будто его нет.

Я создал артефакт maven, который представляет собой простой кувшин, содержащий реализацию расширения, и файл META-INF/services/javax.imageio.spi.ImageReaderSpi, содержащий имя класса, реализующего Spi.

Я уверен, что банка находится в пути к классам, потому что я использую в нем помощника, и он найден.

Для записи, я развертываю проект (WAR) в Tomcat, а расширительная банка находится в папке WEB-INF/lib.

Исходный код jar: available here Файл META-INF включен во время сборки maven (это делает аннотация @MetaInfServices).

Я застрял здесь, я думаю, что я делаю все правильно, вот почему я ищу вашу помощь!

+1

Это может быть проблема загрузчика классов. Ваш SPI может загружаться в загрузчик классов, который существует выше загрузчика системного класса и, следовательно, недоступен для него (вы можете смотреть только вниз по иерархии, а не вверх). Вы пытались добавить Jar, содержащий ваш SPI, в папку 'ext' JRE, которую использует Tomcat? – MadProgrammer

+0

И файл службы на самом деле там, когда вы развертываете с хорошими записями и т. Д.? Вы уверены, что, например, он не перезаписывается другим шагом процесса сборки где-то? – fge

+0

MadProgrammer: Я пробовал, но, возможно, я не пытался в правой JVM, повторю попытку. –

ответ

2

Есть некоторые потенциальные ошибки с использованием плагинов ImageIO, загружаемых из WEB-INF/lib, из-за иерархии ClassLoader в веб-контейнере (как упоминалось в разделе комментариев в разделе @MadProgrammer). Добавление плагинов в веб-контейнеры. Общая папка libs (или путь к классам) обычно является наилучшим и простым способом.

Если вам почему-то нужны плагины, входящие в состав вашего приложения, вам нужно позвонить ImageIO.scanForPlugins() откуда-нибудь в веб-приложении.

Это сделает плагины доступными, но вводит утечку ресурсов/памяти (плагины остаются в памяти после повторного развертывания веб-приложения).

См. Мой ответ в теме How to resolve OutOfMemoryError with ImageIO plugins as the cause? для анализа и решения обеих проблем.

+0

Я также попытался поместить банку в папку lib, но повторю попытку + добавить вызов ImageIO.scanForPlugins(). –

+0

Спасибо, Харальд, похоже, что проблема действительно связана с ClassLoader. Я использовал ваше решение. Я также опубликовал свою библиотеку по адресу http://bluepyth.github.io/jpeg-cmyk/, в которую входит ваш ContextListener.Спасибо за это :) –

+0

@RomainSertelon Рад, что вы заработали! Вы, конечно, можете делать все, что угодно, с кодом, если оно соответствует лицензии BSD. Однако, чтобы избежать фрагментации библиотеки, я предпочел бы, чтобы вы либо привязались к моей библиотеке, либо, по крайней мере, разветвили ее на GitHub, и сохранили имя пакета, чтобы улучшения/исправления ошибок могли быть взаимно применены. Но, конечно, делай, как хочешь. :-) – haraldK

Смежные вопросы