gpt4 book ai didi

Java lang.process 运行 jar "/usr/bin/java: cannot execute binary file"

转载 作者:行者123 更新时间:2023-11-29 05:12:42 32 4
gpt4 key购买 nike

我正在尝试使用 lang.Process 类从另一个 Java 应用程序运行 jar 文件“reportTool.jar”。

        ...
String os = System.getProperty("os.name").toLowerCase();
String shell = "";

if (os.contains("win")) shell = "cmd";
else shell = "/bin/sh";

logger.info(shell);

Process process = Runtime.getRuntime().exec(shell + " java -jar " + reportToolJar);

logger.info("Waiting for reportTool");

InputStream in = process.getInputStream();
InputStream err = process.getErrorStream();

BufferedReader brIN = new BufferedReader(new InputStreamReader(in), 999999);
BufferedReader brERR = new BufferedReader(new InputStreamReader(err), 999999);

String lineERR, lineIN;

while ((lineERR = brERR.readLine()) != null) {
logger.error(lineERR);
}
brERR.close();

while ((lineIN = brIN.readLine()) != null) {
logger.info(lineIN);
}
brIN.close();
process.waitFor();
...

但是,当我去执行时,我得到了

411  [main] ERROR reportToolController.ReportToolController  - /usr/bin/java: /usr/bin/java: cannot execute binary file

请注意,reportToolJar 是一个字符串,包含 jar 文件的绝对路径,此路径是正确的。

reportToolJar 在使用与上面代码中执行的命令完全相同的命令从终端运行时运行良好。

最佳答案

是这样的:

你实际上是在执行命令

/bin/sh java -jar <jar>

不是命令

java -jar <jar>

如果您从命令行尝试第一个,您将得到与您的过程相同的错误。

原因是 bash(我猜/bin/sh 实际上指向它),当在其命令行上给定一个文件时,实际上只接受一个文本文件,它期望包含 shell 命令。

因此,如果您有一个文本文件,例如“test.txt”,其中包含

java -jar <jar>

即使该文件未设置可执行权限并且没有 #!/bin/bash魔法线,它会被正确执行。

但就bash而言,二进制可执行文件(如/usr/bin/java)不是可接受的shell 脚本很关心,你会得到上面的错误。

可能的解决方案:

  • 丢掉shell,直接执行java。
  • 创建一个小的 shell 脚本来调用您的命令并执行它。
  • 使用/bin/bash -c "java -jar <jar>" .请注意,包括其参数在内的整个命令需要作为单个参数传递,因此需要引号。

关于Java lang.process 运行 jar "/usr/bin/java: cannot execute binary file",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27801988/

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