【问题标题】:Issue in getImageWritersByFormatName for Tiff. Getting image writerTiff 的 getImageWritersByFormatName 问题。获取图像编写器
【发布时间】:2014-03-20 04:40:36
【问题描述】:

我正在尝试将 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,导致抛出异常。

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

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

【问题讨论】:

  • 如果我记得,Tiff 不支持开箱即用,您需要 JAI 插件...
  • 我认为我指出的最后一个依赖项是 jai_core。另外,正如我所说,它在开发机器 Eclipse 中运行良好。只有在linux下部署到Tomcat服务器时才会出现问题
  • 您是否将jai_core 放在Java 的ext 目录中?
  • 据我记忆,是的。当它不在那里时,我们遇到了问题,并尝试使用自定义类加载器来加载我们的应用程序。一旦我们把它放在那里,一切都奏效了
  • JVM应该服从最高权限。 ext 目录中的 Jars 首先被加载,因此当类加载器查找类时,它们首先检查父级......从内存中......所以他们应该首先从 ext 目录中找到类

标签: java image maven tomcat tiff


【解决方案1】:

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

我先总结一下,这个问题在开发机上的eclipse中没有出现,在Tomcat服务器上出现。

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

使用默认配置,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,添加 appContextProtection="false" 如下:

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

【讨论】:

  • 面临同样的问题。尝试了第一点。刚刚将静态块放在使用转换功能的类中......很好的答案
  • 有效!!选项 1 整天 ;-) 这应该被标记为接受的答案
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2017-09-16
    • 2011-11-17
    相关资源
    最近更新 更多