在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的设计意图。

  1. 在不更改tomcat默认配置的情况下,重新扫描jar。

    static {ImageIO.scanForPlugins(); }

  2. 更改tomcat配置,因此tomcat不会初始化ImageIO。 编辑文件/conf/server.xml,add appContextProtection =“false”如下:

使用这样的配置,tomcat不会在JreMemoryLeakPreventionListener中调用ImageIO.getCacheDirectory,因此在我们的代码运行之前不会初始化ImageIO。