【问题标题】:Can executable shell scripts still be executable after embedding then extracting from a java archive?嵌入然后从java档案中提取后可执行的shell脚本仍然可以执行吗?
【发布时间】:2013-04-05 17:00:52
【问题描述】:

我有一个包含一些可执行脚本文件的应用程序。而且我知道我们将在其上部署应用程序的目标机器具有 java.util.因此,我将应用程序打包到 java 存档中,并使用“jar xf jarFileName”在目标机器上提取。但可执行脚本不再可执行。是的,我们可以运行“chmod _x scriptName”。但是脚本是否可以在从 jar 文件中提取而无需用户干预的情况下执行?我已经读过:this related question 但这并不是为了保持可执行性。

【问题讨论】:

  • 您可以使用 tar 存档而不是 jar,这将保留文件模式,我不知道没有 tar 的 *nix 操作系统。
  • @MarkHarviston ...也就是说,POSIX 指定pax,而不是tar,因此您在使用后者时依赖于非标准(尽管无处不在)扩展。 (不过,公平地说,pax 支持ustar 格式档案)。

标签: java shell jar


【解决方案1】:

JAR 文件实际上是一个 ZIP 文件,所以这个问题涵盖了您要问的大部分内容:Maintain file permissions when extracting from a zip file using JDK 5 api

问题是像执行位这样的东西是特定于操作系统的,并且在使它们在不同的操作系统上工作时存在各种各样的问题。 “执行”位也不例外。一个典型的(外部)ZIP 文件提取器应该能够处理这个问题(以相关信息首先在 ZIP 文件中为模!)。但是,当您以编程方式提取 ZIP / JAR 文件时这样做会涉及取消选择“额外数据”字节数组......我认为。我不知道jar 命令是做什么的……不过如果你玩游戏的话可以看看源代码……

如果您知道您正在提取的文件/脚本应该是可执行的,我建议您只需修改您的提取过程以在提取后适当地设置执行位。在 Java 7 中,您可以使用新的 NIO 文件属性 API 来做这件事。或者在外部运行chmod。您也可以尝试使用unzip 实用程序而不是jar 进行提取...尽管假设平台已安装unzip

【讨论】:

  • 我让用户手动运行 chmod。只是希望我忽略了一些可以使其自动化的东西。我们只会保留该文档。
【解决方案2】:

如果您想在 Windows 以及 OS X 等 unix 上进行部署,可以免费获得 DOS/Windows 版本的标准实用程序,例如 chmod。您很可能可以将它们与您的应用程序一起分发,并设置路径,以便当且仅当没有可用的本机版本时,安装脚本才能找到您的 Windows chmod.exe,就像在 unix 系统上那样。当然,您必须在不同的系统上进行足够的测试,以确保在某些不寻常的情况下这不会失败。

【讨论】:

  • 我们提供与 .sh 版本并行的 .bat 版本。 Windows 只识别扩展名。所以对于 Windows 用户来说,没有额外的步骤来使 .bats 可执行。谢谢。
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2018-10-06
  • 2017-11-13
  • 1970-01-01
相关资源
最近更新 更多