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

Java Tiff的getImageWritersByFormatName中存在问题。获取图像编写器,java,image,maven,tomcat,tiff,Java,Image,Maven,Tomcat,Tiff,我正在尝试将PDF转换为tif图像。我使用以下代码按格式获取图像编写器 Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("TIFF"); if (writers == null || !writers.hasNext()) { throw new ImageWritingException(); } Iterator writers=Im

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

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

        if (writers == null || !writers.hasNext()) {
            throw new ImageWritingException();
        }
Iterator writers=ImageIO.getImageWritersByFormatName(“TIFF”);
if(writers==null | |!writers.hasNext()){
抛出新的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>

org.icepdf
icepdf核心
com.sun.media
jai_imageio
com.sun.media
jai编解码器
javax.media
贾伊乌岩芯

两种环境之间的区别是什么?如何解决此问题

Tiff支持由Java高级图像插件提供
jai_core.jar


为了正常工作,需要将jar文件添加到JVM的
ext
目录中,否则它将无法正确注册Java高级图像插件
jai_core.jar
提供了Tiff支持


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

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

首先让我总结一下,这个问题不会发生在dev机器上的eclipse中,而是发生在Tomcat服务器上

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

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

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

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

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

    静止的{ ImageIO.scanForPlugins(); }

  • 更改tomcat配置,使tomcat不会初始化ImageIO。 编辑文件/conf/server.xml,添加appContextProtection=“false”,如下所示:


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

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

    首先让我总结一下,这个问题不会发生在dev机器上的eclipse中,而是发生在Tomcat服务器上

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

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

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

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

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

    静止的{ ImageIO.scanForPlugins(); }

  • 更改tomcat配置,使tomcat不会初始化ImageIO。 编辑文件/conf/server.xml,添加appContextProtection=“false”,如下所示:


  • 有了这样的配置,tomcat就不会在JremememoryLeakPreventionListener中调用ImageIO.getCacheDirectory,因此在代码运行之前ImageIO不会被初始化。

    如果我记得,Tiff是不受支持的,你需要JAI插件来实现它……我想我指出的最后一个依赖项是JAI_core。另外,正如我所说,它在dev机器eclipse中运行良好。只有在linux中部署到Tomcat服务器时,问题才会出现。您是否已将
    jai_核心
    放在Java的
    ext
    目录中?据我所知,是的。当它不在那里时,我们遇到了问题,并尝试使用自定义类加载器来加载我们的应用程序。一旦我们把它放进去,一切都正常了JVM应该服从最高权威。ext目录中的JAR首先被加载,所以当类加载器去查看类时,他们首先检查父类…从内存中…所以他们应该首先从ext目录中找到类如果我记得,Tiff不支持开箱即用,你需要JAI插件…我想我指出的最后一个依赖项是JAI_core。另外,正如我所说,它在dev机器eclipse中运行良好。只有在linux中部署到Tomcat服务器时,问题才会出现。您是否已将
    jai_核心
    放在Java的
    ext
    目录中?据我所知,是的。当它不在那里时,我们遇到了问题,并尝试使用自定义类加载器来加载我们的应用程序。一旦我们把它放进去,一切都正常了JVM应该服从最高权威。ext目录中的jar首先被加载,所以当类加载器查找类时,他们首先检查父类…从内存中…所以他们应该首先从ext目录中找到同样的问题。我试过第一点。只是将静态块放在使用转换功能的类中。。。很好的回答,很有效!!选项1全天;-)这应该被标记为已接受的答案,并面临相同的问题。我试过第一点。刚刚放置了静态块