TwelveMonkeys:读取JPEG时找不到ProgressListenerBase类

时间:2018-06-12 06:55:16

标签: java image twelvemonkeys

错误说明

上传图片时,我们的项目需要进行一些上传后处理。但是,在上传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来处理CMYK编码的JPG图像。 EAR由以下部分组成:

  • project-common(JAR)
  • project-ejb(EJB)=>取决于项目共同
  • project-web(WAR)=>取决于project-common和project-ejb
  • 项目休息(WAR)=>取决于project-common和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. documentationthis SO question之后,我在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/ProgressListenerBaseproject-ejb中存在project-web,因此我不明白为什么找不到该课程

  2. 无论在ImageIO.read(file)还是project-ejb中调用project-web,错误都是相同的

  3. 我尝试在ImageIO.scanForPlugins()之前添加ImageIO.read(file),错误相同

  4. 解决方法

      

    另一个安全选项是将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依赖项意味着需要手动更新和替换这些依赖项。

    问题:这是解决方法唯一的解决方案或我搞砸了哪里?

0 个答案:

没有答案