Linux系统调整java程序启动用户,导出xlsx时抛出Permission denied异常问题。

jdk1.8环境
出现的原因就是原先的java服务启动是root启动的,之后由于安全原因,由Linux子用户进行启动java服务,导致的导出xlsx时出现错误,错误信息如下:

java.lang.RuntimeException: java.io.IOException: Permission denied
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:688)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:676)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:88)
	at com.ruoyi.common.utils.poi.ExcelUtil.createSheet(ExcelUtil.java:605)
	at com.ruoyi.common.utils.poi.ExcelUtil.exportExcel(ExcelUtil.java:248)
	at com.ruoyi.common.utils.poi.ExcelUtil.exportExcel(ExcelUtil.java:221)
	at com.cqcs.effie.admin.JudgeLibraryCtrl.selectExport(JudgeLibraryCtrl.java:767)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)

java程序使用的临时目录位置是/tmp。
经过分析是org.apache.poi.util.DefaultTempFileCreationStrategy#createPOIFilesDirectory方法默认创建了临时目录导致的,之前的目录是root创建的,所以在使用Linux
子用户启动java服务后,就会导致导出excel失败。

poi基础入口点:
org.apache.poi.xssf.streaming.SXSSFWorkbook#createSheetDataWriter:
image

问题代码处:
org.apache.poi.util.DefaultTempFileCreationStrategy#createPOIFilesDirectory:
image

修复方法:
调整/tmp/poifiles的目录权限即可,执行chown -R <用户>:<用户组> /tmp/poifiles命令即可,<>里的内容替换为自己的java程序使用的用户。

查询Linux系统java环境临时目录的位置: /usr/local/jdk8/bin/java -XshowSettings:properties -version 2>&1 | grep 'java.io.tmpdir'

posted @ 2026-05-07 18:18  星小梦  阅读(43)  评论(0)    收藏  举报