Maven构建RPM包时post-remove阶段尝试删除已被post-install删除的映射文件的解决方案咨询
你推测的完全正确——RPM会严格跟踪%files段中列出的所有文件,在卸载阶段尝试逐一删除它们。由于你在post-install脚本里提前删掉了这些文件,RPM找不到它们就会抛出那些警告。下面给你几个可行的解决方案,按推荐程度排序:
方案1:将临时安装文件移出RPM跟踪的%files目录
最合理的做法是,不要把这些仅用于post-install阶段的临时文件放到正式的安装目录(即${rpm.info.install_dir})里,而是打包到RPM的共享数据目录(比如%{_datadir}/my-app/install/),之后在post-install脚本里复制到临时目录使用,用完再删除。这样这些临时文件依然属于RPM的一部分,但RPM跟踪的是共享数据目录下的副本,卸载时会正常清理那里的文件,不会管你临时创建的目录。
修改Maven的映射配置如下:
<mappings> <!-- 保留原有的应用核心文件映射 --> <mapping> <directory>${rpm.info.install_dir}</directory> <filemode>700</filemode> <!-- 这里配置你的应用核心文件 --> </mapping> <!-- 新增临时安装文件的映射,放到RPM的共享数据目录 --> <mapping> <directory>%{_datadir}/my-app/install</directory> <filemode>700</filemode> <sources> <source> <location>src/main/resources/install</location> </source> </sources> </mapping> </mappings>
然后在post-install脚本中调整逻辑:
# 复制临时文件到目标操作目录 cp -r %{_datadir}/my-app/install/* ${rpm.info.install_dir}/ # 执行你的post-install操作(比如配置服务、初始化数据等) # ... # 用完后删除临时操作目录 rm -rf ${rpm.info.install_dir}
方案2:用%ghost标记临时文件
如果你坚持要把这些文件放到${rpm.info.install_dir},可以在RPM的spec文件中给这些文件加上%ghost标记。%ghost告诉RPM:“这个文件理论上应该存在,但如果卸载时找不到它,不要报错”。
如果你的Maven RPM插件允许自定义spec片段,可以在%files段中添加:
%files %defattr(-,root,root) # 你的其他应用文件... %ghost ${rpm.info.install_dir}/file1.conf %ghost ${rpm.info.install_dir}/file2.conf %ghost ${rpm.info.install_dir}/dir1/file1.service
不过这种方式的缺点是需要手动列出所有临时文件,一旦文件数量多或者有新增/删除,维护成本会很高。
方案3:在Post-Remove脚本中跳过不存在的文件(不推荐)
虽然可以在post-remove脚本里先检查文件是否存在再尝试删除,但RPM的卸载流程会优先处理%files中的文件,所以这种方式无法阻止RPM本身抛出的警告,只能做后续清理,因此不推荐。
内容的提问来源于stack exchange,提问作者JeyJ

