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 的设计意图。
不改变tomcat默认配置,重新扫描jar。
静态 { ImageIO.scanForPlugins(); }
更改 tomcat 配置,因此 tomcat 不会初始化 ImageIO。编辑文件 /conf/server.xml?add appContextProtection="false" 如下:
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" appContextProtection="false" />
通过这样的配置,tomcat 不会调用 JreMemoryLeakPreventionListener 中的 ImageIO.getCacheDirectory,所以 ImageIO 在我们的代码运行之前不会被初始化。
| 归档时间: |
|
| 查看次数: |
2805 次 |
| 最近记录: |