我正在为 Java 应用程序构建一个 linux 安装程序,最后我使用 ant 将 install.jar 和 setup.sh 放入一个 zip 文件中。
这个想法是用户解压缩 zip 文件,然后运行 setup.sh 但问题是他们总是需要先 chmod setup.sh 给自己执行权限。
我想删除这一步,我不确定问题部分是否是:
- 我在 Windows 上构建
- 我用 ant zip 任务构建
- 或者 zips 不能 presreve 权限,并且总是在没有 x 权限的情况下解压缩。
您不必切换到 tar 文件。我不知道为什么不了解 Ant 的人会在这个话题上提供建议。
使用 zipfileset 的 filemode 参数。记录在http://ant.apache.org/manual/Types/zipfileset.html
您不能将 Linux/Unix 文件权限存储在 ZIP 文件中。
使用 ZIP 标头内的“外部属性”字段进行编辑(在注释后),这些属性可以存储在 ZIP 文件中。GNUunzip
显然能够读取该附加字段并恢复文件权限。我不确定这是什么时候添加到 ZIP 格式的,因为早期版本 - 来自 MS-DOS 世界 - 不支持这个。
TAR 格式——作为“原生”Unix/Linux 格式——被设计为包含文件属性,Ant 可以创建 TAR 文件,在所有 Linux/Unix 操作系统中保留属性。
<tar 压缩="gzip" destfile="my-archive.tgz"> <tarfileset mode="544" dir="dir_with_shell_scripts"> <include name="*.sh"/> </tarfileset> </tar>
要扩展 Blaine 的答案,您可以使用<zipfileset>子元素来指定权限:
<zip destfile="build/MyApplication.zip" encoding="UTF-8">
<zipfileset dir="${content-dir}" encoding="UTF-8"
includes="**/setup.sh" filemode="755"/>
<zipfileset dir="${content-dir}" encoding="UTF-8"
excludes="**/setup.sh"/>
</zip>
现代 Linux 发行版中的 zip/unzip 将保留文件权限。但是您需要确保 Windows 中的 zip 支持这一点。
如果您使用 tar 文件而不是 zip 文件,它应该为您保留权限。文件的所有者和组可能不匹配,但权限位会匹配。
<shellscript shell="sh" dir="abc" failonerror="true">
zip -ry abc.zip *
</shellscript>
上面的 ant 脚本调用 shell 脚本来创建 zip 存档,其中的权限保存得非常好。它适用于 Ant 1.7 及更高版本。但是我没有尝试在 Windows 上验证运行这个 ant 脚本。这在mac上效果很好。