软件吧
登录注册账号
/posts/java-logs-centos-jdk
电脑必备

部署包里的空目录老丢,我查了半天是打包工具默认跳过

码农小张 78 0 13

上周发版,一个 Java 服务起不来,报错说日志目录不存在。我本地跑得好好的,一查部署包,logs/ 这个空目录没了。

先说环境:CentOS 7.9,JDK 11.0.15,打包用 Maven assembly 3.3.0,解压是运维那边直接 tar -xzf。

排查过程列一下:

  1. 先看 Maven 打包日志,没报错,assembly 配置里目录结构写得没问题。
  2. 解开 tar 包对比,bin/、conf/ 都在,就 logs/ 和 data/ 两个空目录没打进去。
  3. 翻 assembly 文档,发现默认 includeEmptyDirectories 是 false。得,改成 true,重新打包,tar -tzf 能看到空目录了。

本来以为完事了,结果运维那边又出幺蛾子。他们用 tar -xzf 解压到目标目录,空目录是出来了,但权限是 755,属主是 root。logs/ 目录应用用户跑起来没权限写,启动又失败。

最后在打包脚本里加了一步,解压后 chown -R app:app logs data,才彻底消停。

几个实测数据:

  • Maven assembly 3.3.0 默认 includeEmptyDirectories=false,3.4.0 我没测,不确定改了没。
  • tar 解压空目录权限跟包里记录的一致,打包时 tar -cf 的权限是啥就是啥,别指望解压时自动变。
  • 我拿三台机子跑了这版包(CentOS 7.9 两台,Ubuntu 20.04 一台),空目录问题一致,权限问题只在 root 解压时出现。

另外提醒一句:如果用的是 tar 打包,--exclude 写不好容易把空目录连带父目录一起干掉了。我同事之前写 --exclude='logs/*',结果 logs/ 整个没了。要排除内容不排除目录,得写成 --exclude='logs/*' 但保留父目录,或者干脆打包前用 find 把空目录列出来,用 tar -T 指定。

你们的部署包是怎么处理的?有没有遇到过空目录丢或者权限不对的情况?你们是打包侧解决还是解压侧写脚本兜底?

登录后可以为帖子点赞,但本帖内容对所有人开放阅读。

社区回应

0 Replies

还没有回应,抢一个沙发。

登录后可以回应和点赞,但本帖内容对所有人开放阅读。