TwelveMonkeys: класс ProgressListenerBase не найден при чтении JPEG - PullRequest
0 голосов
/ 12 июня 2018

Описание ошибки

При загрузке изображения наш проект должен выполнить некоторую обработку после загрузки.Однако выполнение кода после загрузки файла 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.

Устранение неполадок

  1. В соответствии с документацией и этого 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, поэтому я не понимаю, почему класс ненайдено

  2. Независимо от того, вызывается ли ImageIO.read(file) в project-ejb или project-web, ошибка та же

  3. Я пытался добавить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 означает, что эти зависимости необходимо обновлять и заменять вручную.

Вопрос : является ли это обходным решением илигде я все испортил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...