SpringBoot项目长时间未访问导致Tomcat临时文件夹被删除的解决方案

 更新时间:2026年02月04日 09:49:45   作者:qq_29757467  
做SpringBoot开发的同学,大概率会遇到一个隐蔽的坑:项目部署在Linux服务器上,但如果系统长时间(比如10天)无人访问,再次上传文件就会报错,排查半天找不到原因,其实这个问题的根源,和Tomcat的临时文件夹密切相关,今天就带大家彻底搞懂这个问题,从原因到解决方案

引言

做SpringBoot开发的同学,大概率会遇到一个隐蔽的坑:项目部署在Linux服务器上,通过java -jar启动后,文件上传功能一切正常,但如果系统长时间(比如10天)无人访问,再次上传文件就会报错,排查半天找不到原因,最后重启项目又神奇恢复了。

其实这个问题的根源,和Tomcat的临时文件夹、Linux系统的临时文件清理机制密切相关。今天就带大家彻底搞懂这个问题,从原因到解决方案,一步到位,再也不用靠“重启救急”。

一、问题复现:隐蔽且易忽略

先明确问题场景,避免大家对号入座出错:

  • 项目类型:SpringBoot打Jar包,通过 java -jar xxx.jar 方式启动(非war包部署到独立Tomcat);
  • 部署环境:Linux服务器(CentOS、Ubuntu等均会出现);
  • 触发条件:系统长时间无人访问(通常10天左右),再次使用文件上传功能时报错;
  • 临时解决:重启SpringBoot项目,上传功能恢复正常。

二、问题根源:两步拆解,一看就懂

这个问题不是SpringBoot的bug,也不是Tomcat的问题,而是「Tomcat临时文件存储机制」和「Linux临时文件清理机制」共同作用的结果,拆解成两步就能明白:

1. Tomcat临时文件夹的作用

当我们用SpringBoot Jar包启动项目时,SpringBoot会内置一个Tomcat容器。当项目中存在「文件上传」功能时,上传的文件并不会直接被处理,而是先转换成临时文件,存放在Tomcat的临时文件夹中,处理完成后再删除临时文件(或保留,取决于业务逻辑)。

重点:SpringBoot内置Tomcat,在Linux环境下,默认的临时文件夹路径是 /tmp/ 目录下(比如 /tmp/tomcat.xxxxxx.xxxx/ ),这个路径是Tomcat自动生成的,无需手动配置。

2. Linux系统的临时文件清理规则

Linux系统为了避免/tmp目录占用过多磁盘空间,有一个默认的临时文件清理机制(由tmpwatch或systemd-tmpfiles服务管理),核心规则是:

「/tmp目录下的文件/文件夹,如果连续10天没有被访问、修改,就会被系统自动删除」。

3. 问题闭环

系统长时间无人访问 → /tmp目录下的Tomcat临时文件夹10天未被 操作 → 被Linux系统自动删除 → 再次上传文件时,Tomcat无法找到临时文件夹存放临时文件 → 上传失败 → 重启项目后,Tomcat重新生成临时文件夹 → 功能恢复。

三、解决方案:两种方式,按需选择

针对这个问题,有两种解决方案,一种是临时救急,一种是彻底根治,大家可以根据自己的部署场景选择。

方案1:临时救急(快速恢复,适合紧急情况)
最简单、最快的方式,就是重启SpringBoot项目。

重启命令(根据自己的项目部署方式调整):

# 1. 查找项目进程(假设项目Jar包名为xxx.jar)
ps -ef | grep xxx.jar
# 2. 杀死进程(替换为查到的进程ID)
kill -9 进程ID
# 3. 重启项目(后台启动,日志输出到nohup.out)
nohup java -jar xxx.jar 

原理:重启项目后,SpringBoot内置的Tomcat会重新在/tmp目录下生成临时文件夹,恢复临时文件存储功能。
缺点:治标不治本,下次系统长时间未访问,问题还会重复出现;如果项目有状态(比如未持久化的会话),重启会导致状态丢失。

方案2:彻底根治(推荐,一劳永逸)
核心思路:修改Tomcat的临时文件夹路径,将临时文件夹从Linux的/tmp目录(会被自动清理),迁移到自定义目录(不会被系统自动清理)。

具体操作:在SpringBoot的配置文件(application.yml 或 application.properties)中,配置Tomcat的basedir属性,指定自定义临时目录。

重点:yml配置示例(直接复制可用,适配大部分场景)

# 开发/生产环境通用配置
server:
  # 服务器HTTP端口(根据自己的需求调整)
  port: 6116
  servlet:
    # 应用访问路径(默认/,无需修改)
    context-path: /
  tomcat:
    # Tomcat URI编码(避免中文乱码,必配)
    uri-encoding: UTF-8
    # Tomcat最大线程数(根据服务器配置调整,默认200)
    max-threads: 800
    # Tomcat初始化线程数(默认25,优化后提升启动速度)
    min-spare-threads: 30
    # 关键配置:自定义Tomcat临时文件夹路径(避免被Linux清理)
    # 注意:Linux环境请配置绝对路径,比如 /home/tomcat/tmp
    # Windows环境可配置 D:\\tmp(双反斜杠转义)
    # 此处为  linux环境可配置
    basedir: /home/tomcat/tmp

配置说明(避坑重点)

  • 路径格式:Linux环境必须配置绝对路径(比如 /home/tomcat/tmp),Windows环境用双反斜杠(D:\tmp),避免路径解析错误;
  • 权限问题:自定义目录(比如 /home/tomcat/tmp)需要给启动项目的用户(比如java用户)赋予读写权限,否则Tomcat无法创建临时文件,会报错;
  • 无需手动创建目录:配置完成后,重启项目,Tomcat会自动创建该目录,无需手动mkdir;
  • 兼容所有SpringBoot版本:不管是2.x还是3.x版本,这个配置都适用,无需修改其他参数。

权限配置命令(Linux环境必看)
如果配置后报错“权限不足”,执行以下命令赋予权限(替换目录路径和用户名):

# 1. 创建自定义临时目录(如果Tomcat未自动创建)
mkdir -p /home/tomcat/tmp
# 2. 赋予权限(假设启动用户是java,替换为自己的用户)
chown -R java:java /home/tomcat/tmp
# 3. 赋予读写执行权限
chmod -R 755 /home/tomcat/tmp

四、补充注意事项(避坑必看)

  1. 不要将临时目录配置在/tmp、/var/tmp等系统默认临时目录下,这些目录都会被系统定期清理;
  2. 自定义临时目录无需担心磁盘占用:Tomcat会自动清理过期的临时文件(比如上传完成后的临时文件),无需手动删除;
  3. 如果项目部署在Docker容器中,除了配置basedir,还需要将自定义临时目录挂载到宿主机,避免容器重启后临时文件丢失;
  4. 排查技巧:如果不确定临时文件夹是否被删除,可以通过 ls /tmp | grep tomcat 命令查看,若没有相关文件夹,说明已被系统清理。

五、总结

SpringBoot项目长时间未访问,Tomcat临时文件夹被删除的问题,本质是「系统清理机制」和「Tomcat默认配置」的冲突。

紧急情况用「重启项目」快速恢复,生产环境推荐用「配置Tomcat自定义临时目录」彻底根治,配置简单、一劳永逸,还能避免后续重复踩坑。

如果大家在配置过程中遇到权限报错、路径解析错误等问题,可以在评论区留言,我会及时回复排查思路~

以上就是SpringBoot项目长时间未访问导致Tomcat临时文件夹被删除的解决方案的详细内容,更多关于SpringBoot项目未访问导致Tomcat被删除的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot项目中如何动态切换数据源、数据库

    SpringBoot项目中如何动态切换数据源、数据库

    本文主要介绍了SpringBoot项目中如何动态切换数据源、数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • 基于多线程中join()的用法实例讲解

    基于多线程中join()的用法实例讲解

    下面小编就为大家带来一篇基于多线程中join()的用法实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 举例讲解Java编程中this关键字与super关键字的用法

    举例讲解Java编程中this关键字与super关键字的用法

    这篇文章主要介绍了Java编程中this关键字与super关键字的用法示例,super是this的父辈,在继承过程中两个关键字经常被用到,需要的朋友可以参考下
    2016-03-03
  • 轻松了解java中Caffeine高性能缓存库

    轻松了解java中Caffeine高性能缓存库

    本文我们将学习了解到用于Java的高性能缓存库Caffeine,其使用Window TinyLfu清理策略,提供最佳的命中率
    2021-08-08
  • 详解Java数据结构之平衡二叉树

    详解Java数据结构之平衡二叉树

    平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。本文将详解介绍一下平衡二叉树的原理与实现,需要的可以参考一下
    2022-02-02
  • Java国际化简介_动力节点Java学院整理

    Java国际化简介_动力节点Java学院整理

    这篇文章主要为大家简单介绍了Java国际化的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • gradle和maven打包时排除application.properties问题

    gradle和maven打包时排除application.properties问题

    文章主要介绍了Gradle、Maven(用于构建JAR包)和Maven(用于构建WAR包),文章基于个人经验,为读者提供了参考,并鼓励大家支持脚本之家
    2024-12-12
  • springboot之如何同时连接多个redis

    springboot之如何同时连接多个redis

    这篇文章主要介绍了springboot之如何同时连接多个redis问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringBoot自动配置实现的详细步骤

    SpringBoot自动配置实现的详细步骤

    这篇文章主要为大家介绍了SpringBoot自动配置实现详细的过程步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 向量数据库之如何使用Elasticsearch实现向量数据存储与搜索

    向量数据库之如何使用Elasticsearch实现向量数据存储与搜索

    这篇文章主要介绍了向量数据库之如何使用Elasticsearch实现向量数据存储与搜索,在向量函数的计算过程中,会对所有匹配的文档进行线性扫描,因此,查询预计时间会随着匹配文档的数量线性增长,本文给大家讲解的非常详细,需要的朋友参考下吧
    2023-06-06

最新评论