2

我使用 OpenJDK 11 和 Apache Commons Compress 1.20 创建了一个 zip 文件,该文件由使用 Netty 服务器的 API 返回。此 zip 文件包含具有可执行文件权限 (755) 的 gradle 包装器。

-rwxr-xr-x  1 myuser  mygroup  5766 Aug 24 16:03 gradlew

我用 Commons Compress 压缩它,在 API 响应中返回它,然后浏览器将 zip 保存到磁盘。

如果我在MacOS Mojave中提取 zip 文件,则 gradle 包装文件如下所示(带有扩展文件属性列表):

ls -al@ gradlew
-rwxr-xr-x@  1 myuser  mygroup    5766 Nov 30  1979 gradlew
    com.apple.quarantine        56

好的,它已被隔离,但仍可执行。执行它可以正常工作。

如果我在MacOS Catalina中提取 zip 文件,则 gradle 包装文件如下所示(带有扩展文件属性列表):

ls -al@ gradlew
-rw-rw-r--@  1 myuser  mygroup    5766 Nov 30  1979 gradlew
    com.apple.quarantine        57

可执行文件权限已被 Catalina 删除。除了在解压后添加可执行文件权限之外,有什么方法可以规避这个问题吗?

4

1 回答 1

0

我最近遇到了类似的问题,并在Spring Initializr source code找到了解决方案

简而言之,解决方法是修改gradlew归档入口的权限,使其解压后可执行。

这是我使用的代码示例,它位于 Kotlin 上,但如果需要,可以轻松转换为 Java。

val entry = ZipArchiveEntry(file, name)

entry.unixMode = if (Files.isDirectory(path)) {
     UnixStat.DIR_FLAG or UnixStat.DEFAULT_DIR_PERM
} else {
    UnixStat.FILE_FLAG or if (entryName == "gradlew") UnixStat.DEFAULT_DIR_PERM else UnixStat.DEFAULT_FILE_PERM
}
于 2021-09-24T13:32:19.937 回答