Tiff 的 getImageWritersByFormatName 中的问题。获取图像编写器

TV *_*ath 1 java tomcat tiff image maven

我正在尝试将 PDF 转换为 tif 图像。我使用以下代码按格式获取图像编写器。

Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("TIFF");

        if (writers == null || !writers.hasNext()) {
            throw new ImageWritingException();
        }
Run Code Online (Sandbox Code Playgroud)

当我在 Eclipse 中独立运行应用程序时,这很好用。但是当我将应用程序部署到 linux 中的 tomcat 服务器时,writers==null是假的,但!writers.hasNext是真导致抛出异常。

我使用 maven 将项目构建为战争。

我在 pom 文件中有以下依赖项。

<dependency>
            <groupId>org.icepdf</groupId>
            <artifactId>icepdf-core</artifactId>
        </dependency>

        <dependency>
            <groupId>com.sun.media</groupId>
            <artifactId>jai_imageio</artifactId>
        </dependency>

        <dependency>
            <groupId>com.sun.media</groupId>
            <artifactId>jai-codec</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.media</groupId>
            <artifactId>jai_core</artifactId>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

两种环境之间有什么区别?我该如何解决这个问题?

小智 5

我遇到了同样的问题并找到了根本原因。

我先总结一下,这个问题在dev机器上的eclipse中不会出现,而是在Tomcat服务器上出现。

根本原因是imageio使用SPI,JDK中有一个基本的实现(请参考rt.jar,我们可以找到bmp和jpeg两个插件),而我们想要的插件在jai_imageio.jar中。

在默认配置下,Tomcat 在 ImageIO 初始化期间扫描 rt.jar 中的插件以查找插件。稍后当应用程序运行时,将不会扫描 jai_imageio.jar。

因此,jai_imageio.jar 中的插件不可用。在开发机器上运行时,会扫描 jai_imageio.jar。

下面列出了几种解决方案,我会推荐第一种,因为它符合 ImageIO 的设计意图。

  1. 不改变tomcat默认配置,重新扫描jar。

    静态 { ImageIO.scanForPlugins(); }

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

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" appContextProtection="false" />

通过这样的配置,tomcat 不会调用 JreMemoryLeakPreventionListener 中的 ImageIO.getCacheDirectory,所以 ImageIO 在我们的代码运行之前不会被初始化。