Описание ошибки
При загрузке изображения наш проект должен выполнить некоторую обработку после загрузки.Однако выполнение кода после загрузки файла JPEG
BufferedImage bImg = ImageIO.read(file);
вызывает исключение:
Caused by: java.lang.NoClassDefFoundError: com/twelvemonkeys/imageio/util/ProgressListenerBase
at com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageReaderSpi.createReaderInstance(JPEGImageReaderSpi.java:126)
at javax.imageio.spi.ImageReaderSpi.createReaderInstance(ImageReaderSpi.java:320)
at javax.imageio.ImageIO$ImageReaderIterator.next(ImageIO.java:529)
at javax.imageio.ImageIO$ImageReaderIterator.next(ImageIO.java:513)
at javax.imageio.ImageIO.read(ImageIO.java:1443)
at javax.imageio.ImageIO.read(ImageIO.java:1308)
Все работает хорошо при загрузке файла PNG.
Конфигурация проекта
Наш проект Java EE 7 изначально требует TwelvesMonkeys для обработки изображений JPG в кодировке CMYK.EAR состоит из:
- общего проекта (JAR)
- project-ejb (EJB) => зависит от общего проекта
- project-web (WAR) => зависит от общего проекта и project-ejb
- project-rest (WAR) => зависит от общего проекта и project-ejb
project-common
имеетЗависимости TwelveMonkeys:
<!-- Image IO -->
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-bmp</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.servlet</groupId>
<artifactId>servlet</artifactId>
<version>3.3.2</version>
</dependency>
, которые передаются другим компонентам транзитивностью.Мы обрабатывали только .jp(e)g
и .png
.Мы также используем Thumbnailator вместе с TwelveMonkeys.
Устранение неполадок
В соответствии с документацией и этого SO вопроса , я добавил слушателя в project-web
:
<listener>
<display-name>ImageIO service provider loader/unloader</display-name>
<listener-class>com.twelvemonkeys.servlet.image.IIOProviderContextListener</listener-class>
</listener>
Под Netbeans com/twelvemonkeys/imageio/util/ProgressListenerBase
присутствует в project-ejb
и project-web
, поэтому я не понимаю, почему класс ненайдено
Независимо от того, вызывается ли ImageIO.read(file)
в project-ejb
или project-web
, ошибка та же
Я пытался добавитьImageIO.scanForPlugins()
до ImageIO.read(file)
, ошибка та же
Обходной путь
После
Другим безопасным вариантом является размещениеФайлы JAR в общей или общей папке lib сервера приложений.
Я вручную поместил зависимости
# common dependencies:
> common-image-3.3.2.jar
> common-io-3.3.2.jar
> common-lang-3.3.2.jar
# shared dependencies:
> imageio-core-3.3.2.jar
> imageio-metadata-3.3.2.jar
# TwelveMonkeys dependencies:
> imageio-jpeg-3.3.2.jar
> imageio-bmp-3.3.2.jar
# Servlet
> servlet-3.3.2.jar
в {PAYARA_DIR}\glassfish\domains\{DOMAIN_NAME}\lib
папку без удаленияслушатель.Я изменил область зависимостей на <scope>provided</scope>
, так как она не встроена в приложение.
Я поставил это в качестве обходного пути, потому что я понимаю, что добавления прослушивателя должно быть достаточно, так что добавление зависимостей вручную кажется излишним.Более того, даже если мы не будем часто менять версию наших зависимостей, изменение зависимостей TwelveMonkeys означает, что эти зависимости необходимо обновлять и заменять вручную.
Вопрос : является ли это обходным решением илигде я все испортил?