rpmbuild创建tmp文件并因尝试删除它们而导致“Permission denied”失败

时间:2011-12-09 17:06:57

标签: java rpm rpmbuild

背景

我正在尝试构建一个简单的rpm,它只是将一些Web应用程序源文件复制到安装目录。 Web应用程序是用Java编写的,由供应商提供(即它不是由我编写的)。

由于下面描述的错误,rpm无法构建。但是,我已经成功地为来自同一供应商的另一个基于Java的Web应用程序构建了几乎相同的rpm。除了安装路径和源文件名之类的名称之外,spec文件是相同的。

问题

rpmbuild -v -bb --clean SPECS/web-app.spec在尝试删除Permission denied中的某些文件时失败并显示{BUILDROOT}/web-app-1.0/tmp

我检查了rpmbuild无法删除的文件的权限。以下是一些例子:

-r--r--r--. 1 signer signer  1203 Jan 13  2006 Adler32.class
-r--r--r--. 1 signer signer 19498 Jan 13  2006 Deflate.class
-r--r--r--. 1 signer signer   628 Jan 13  2006 Deflate$Config.class
-r--r--r--. 1 signer signer  8673 Jan 13  2006 InfBlocks.class

他们为我的构建用户(signer)拥有正确的所有权和组,但没有写入权限。

这些文件不是我在rpm规范中明确定义的任何进程的一部分。我的所有spec文件都运行%setup,创建一个目录,并将文件复制到其中。在%setup期间提取的源tarball对其所有文件具有正确的权限;我可以提取并删除它创建的树。这些文件不是源tarball的一部分。我认为tmp文件与某些Java文件处理有关; rpmbuild花了很长时间在构建结束时“重新打包”jar文件。我不确定具有什么目的,我怀疑我正在部署的应用程序需要它。

问题

我可以禁用jar文件重新打包来修复此问题吗?还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

可悲的是,看起来.jar可能包含没有写入权限的目录,因此在这种情况下......自己提取受影响的jar的内容,更改权限+w,以及重新压缩它们......: - /

答案 1 :(得分:1)

最简单的解决方案是通过在我的spec文件中添加以下定义来禁用jar重新打包:%define __jar_repack %{nil}

BRPocock的答案也应该有效。我禁用jar重新打包而不是像BRPocock建议的那样自行重新打包罐子的原因是因为rpmbuild在启用jar重新打包的情况下需要花费大约10分钟来构建,但只有一分钟禁用它。