13

我正在为 Java 应用程序构建一个 linux 安装程序,最后我使用 ant 将 install.jar 和 setup.sh 放入一个 zip 文件中。

这个想法是用户解压缩 zip 文件,然后运行 ​​setup.sh 但问题是他们总是需要先 chmod setup.sh 给自己执行权限。

我想删除这一步,我不确定问题部分是否是:

  1. 我在 Windows 上构建
  2. 我用 ant zip 任务构建
  3. 或者 zips 不能 presreve 权限,并且总是在没有 x 权限的情况下解压缩。
4

7 回答 7

26

您不必切换到 tar 文件。我不知道为什么不了解 Ant 的人会在这个话题上提供建议。

使用 zipfileset 的 filemode 参数。记录在http://ant.apache.org/manual/Types/zipfileset.html

于 2014-01-16T17:50:09.347 回答
15

您不能将 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>
于 2012-11-29T20:03:44.710 回答
2

我认为您可以使用Apache Commons Compress做到这一点。

第一段:

访问内部和外部属性(某些 zip 实现用于存储 Unix 权限)。

看看API并寻找setUnixMode()

于 2012-11-29T20:04:54.993 回答
2

要扩展 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>
于 2019-12-21T00:53:32.437 回答
1

现代 Linux 发行版中的 zip/unzip 将保留文件权限。但是您需要确保 Windows 中的 zip 支持这一点。

于 2014-09-19T23:44:38.070 回答
0

如果您使用 tar 文件而不是 zip 文件,它应该为您保留权限。文件的所有者和组可能不匹配,但权限位会匹配。

于 2012-11-29T20:01:19.683 回答
-1
<shellscript shell="sh" dir="abc" failonerror="true">
            zip -ry abc.zip *
</shellscript>

上面的 ant 脚本调用 shell 脚本来创建 zip 存档,其中的权限保存得非常好。它适用于 Ant 1.7 及更高版本。但是我没有尝试在 Windows 上验证运行这个 ant 脚本。这在mac上效果很好。

于 2013-01-08T08:30:17.380 回答