gpt4 book ai didi

java - 构建一个 jar 以包含未获得执行权限的 shell 脚本文件

转载 作者:行者123 更新时间:2023-12-02 01:20:40 25 4
gpt4 key购买 nike

我有一个普通的java应用程序,它有一个主类,该类调用src/main/resources/*.sh下的shell脚本文件

我正在使用 Runtime.getRuntime().exec(cmd) 来执行脚本。

String cmdPath = new this.getClass().getResource("/XXXX.sh").getPath()
String[] cmd = { "bash", cmdPath };

我收到退出代码 127。

1)使用java -jar xxx.jar运行

2)sh文件的文件权限为-rw-rw-r--

如何获得脚本文件的执行权限?

脚本文件位于src/main/resource/下

使用maven-jar插件捆绑jar,脚本文件进入根目录

jar /-com -软件 -cmd.sh

尝试使用自定义脚本的 Maven 程序集插件为 {basedir} 下的所有文件授予 755 权限(未在任何地方定义)。没成功

<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>ourAssembly</id>
<formats>
<format>jar</format>
</formats>

<fileSets>
<fileSet>
<directory>${basedir}</directory>
<includes>
<include>**/*</include>
</includes>
<fileMode>0755</fileMode>
</fileSet>
</fileSets>

最佳答案

URL 的 getPath() 方法返回有效的文件名。 URL 的“路径”只是权限之后的部分,不包括任何查询或片段。 URL 中不允许使用很多字符,因此它们是百分比转义的,并且 getPath() 将返回带有这些转义的字符串。

此外,.jar 条目根本不是文件,它只是 .jar 文件中表示压缩数据的字节子序列。要执行它,您需要将其复制到一个真实的文件中,然后执行它。

类似这样的事情:

Path script = Files.createTempFile(null, ".sh",
PosixFilePermissions.asFileAttribute(
PosixFilePermissions.fromString("rw-rw-r--")));

try (InputStream embeddedScript =
this.getClass().getResourceAsStream("/XXXX.sh")) {

Files.copy(embeddedScript, script, StandardCopyOption.REPLACE_EXISTING);
}

String[] cmd = { "bash", script.toString() };

完成后,您应该删除该副本:

ProcessBuilder builder = new ProcessBuilder(cmd);
builder.inheritIO();

Process process = builder.start();
process.waitFor();

Files.delete(script);

关于java - 构建一个 jar 以包含未获得执行权限的 shell 脚本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57773998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com