在Tiff的getImageWritersByFormatName中出现问题。获得图像编写者

时间:2014-03-20 04:40:37

标签: java image maven tomcat tiff

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

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

        if (writers == null || !writers.hasNext()) {
            throw new ImageWritingException();
        }

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

我使用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>

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

2 个答案:

答案 0 :(得分:4)

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

首先让我总结一下,在dev机器上的eclipse中不会出现问题,它发生在Tomcat服务器上。

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

使用默认配置时,Tomcat会在初始化期间为ImageIO扫描rt.jar中的插件。稍后当应用程序运行时,将不会扫描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”如下:

  3. &lt; Listener className =“org.apache.catalina.core.JreMemoryLeakPreventionListener”appContextProtection =“false”/&gt;

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

答案 1 :(得分:2)

Tiff支持由Java Advanced Imaging插件jai_core.jar提供。

为了正常工作,需要将jar文件添加到JVM的ext目录中,否则它将无法正常注册