上传图片时,我们的项目需要进行一些上传后处理。但是,在上传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
具有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。
在documentation和this 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/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依赖项意味着需要手动更新和替换这些依赖项。
问题:这是解决方法唯一的解决方案或我搞砸了哪里?