在Tiff的getImageWritersByFormatName中出现问题。 获得图像编写者
我正在尝试将PDF转换为tif图像。 我使用以下代码来按格式获取图像编写器。
Iterator writers = ImageIO.getImageWritersByFormatName("TIFF"); if (writers == null || !writers.hasNext()) { throw new ImageWritingException(); }
当我在Eclipse中独立运行应用程序时,这很好用。 但是当我将应用程序部署到linux中的tomcat服务器时, writers == null为false但是!writers.hasNext为true导致抛出exception。
我使用maven来构建战争项目。
我在pom文件中有以下依赖项。
org.icepdf icepdf-core com.sun.media jai_imageio com.sun.media jai-codec javax.media jai_core
两种环境之间有什么区别? 我该如何解决这个问题?
Tiff支持由Java Advanced Imaging插件jai_core.jar
。
为了正常工作,需要将jar文件添加到JVM的ext
目录中,否则将无法正确注册
我遇到了同样的问题并找到了根本原因。
首先我要总结一下,在dev机器上的eclipse中不会出现这个问题,它发生在Tomcat服务器上。
根本原因是imageio使用SPI,并且在JDK中有一个基本实现(请参阅rt.jar,我们可以通过bmp和jpeg的两个插件找到它。)而我们想要的插件位于jai_imageio.jar中。
使用默认配置,Tomcat在初始化期间扫描rt.jar中的插件以获取ImageIO。 稍后当应用程序运行时,将不会扫描jai_imageio.jar。
因此,jai_imageio.jar中的插件不可用。 在dev机器上运行时,会扫描jai_imageio.jar。
下面列出了几种解决方案,我推荐第一种解决方案,因为它符合ImageIO的设计意图。
-
在不更改tomcat默认配置的情况下,重新扫描jar。
static {ImageIO.scanForPlugins(); }
-
更改tomcat配置,因此tomcat不会初始化ImageIO。 编辑文件/conf/server.xml,add appContextProtection =“false”如下:
使用这样的配置,tomcat不会在JreMemoryLeakPreventionListener中调用ImageIO.getCacheDirectory,因此在我们的代码运行之前不会初始化ImageIO。