Java Tiff的getImageWritersByFormatName中存在问题。获取图像编写器
我正在尝试将PDF转换为tif图像。我使用以下代码按格式获取图像编写器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
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不会调用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就不会在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全天;-)这应该被标记为已接受的答案,并面临相同的问题。我试过第一点。刚刚放置了静态块