Java11中RandomAccessFileOrArray.close()告警且资源未释放的解决办法
解决iText5.5.13.3在Java11下TIFF转PDF的资源释放与反射警告问题
一、解决当前iText5的问题
1. 升级iText版本(推荐)
iText5.5.13.3属于旧版本,对Java9+的模块化和反射权限限制适配不足。优先推荐升级到iText7——iText的新一代版本,完全适配Java11+,API设计更规范,相关资源类已实现AutoCloseable,可直接使用try-with-resources语法,同时彻底消除反射警告。
适配SpringBoot2.7.9的iText7 Maven依赖:
<!-- iText7核心模块 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>kernel</artifactId> <version>7.2.5</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>io</artifactId> <version>7.2.5</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>layout</artifactId> <version>7.2.5</version> </dependency> <!-- TIFF格式处理依赖 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>pdfa</artifactId> <version>7.2.5</version> </dependency>
2. 兼容现有iText5的临时方案
如果暂时无法升级版本,可通过以下两种方式解决:
(1)添加JVM参数放行反射访问
在项目启动参数中添加:
--add-opens java.base/java.nio=ALL-UNNAMED
该参数允许iText5反射访问DirectByteBuffer的cleaner()方法,既消除警告,也能让close()方法正常释放文件资源。
(2)封装AutoCloseable包装类
手动封装一个实现AutoCloseable的包装类,让RandomAccessFileOrArray支持try-with-resources语法,避免手动关闭遗漏:
public class AutoCloseableRandomAccessFileOrArray implements AutoCloseable { private final RandomAccessFileOrArray delegate; public AutoCloseableRandomAccessFileOrArray(RandomAccessFileOrArray delegate) { this.delegate = delegate; } public RandomAccessFileOrArray getDelegate() { return delegate; } @Override public void close() throws IOException { delegate.close(); } }
使用示例:
RandomAccessSourceFactory rasf = new RandomAccessSourceFactory(); try (AutoCloseableRandomAccessFileOrArray myTiffFile = new AutoCloseableRandomAccessFileOrArray( new RandomAccessFileOrArray(rasf.createBestSource(tiffFilepath)))) { // TIFF转PDF的业务逻辑 } catch (IOException e) { // 异常处理逻辑 }
配合上述JVM参数,即可正常释放资源并消除警告。
二、可用的PDF生成替代方案
Apache PDFBox:开源免费的PDF处理库,支持TIFF转PDF,API简洁易懂,完全适配Java11+,SpringBoot集成无压力。Maven依赖:
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.29</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox-tools</artifactId> <version>2.0.29</version> </dependency>Flying Saucer:基于旧版iText开发的HTML转PDF工具,适合将HTML模板渲染为PDF,也支持嵌入各类图片格式,适配Java11+。
Aspose.PDF:商业级PDF处理库,功能覆盖几乎所有PDF操作与格式转换场景,文档完善,但需要付费授权。
内容的提问来源于stack exchange,提问作者Alexxxx
相关产品推荐
相关产品推荐

