我试图运行一个jar文件" reportTool.jar"来自另一个使用lang.Process类的java应用程序。
...
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是一个String,它包含jar文件的绝对路径,此路径是正确的。
reportToolJar在使用上面代码中执行的相同命令从终端运行时运行正常。
答案 0 :(得分:3)
这就是:
您实际上正在执行命令
/bin/sh java -jar <jar>
不是命令
java -jar <jar>
如果您从命令行尝试第一个,那么您将从流程中获得相同的错误。
这样做的原因是bash(我猜是/ bin / sh实际指向的),当在命令行上给出一个文件时,实际上只接受一个文本文件,它希望包含shell命令。
所以,如果你有一个文本文件,如&#34; test.txt&#34;其中包含
java -jar <jar>
即使该文件未设置可执行权限且且没有#!/bin/bash
魔术线,也会正确执行。
但就bash
而言,二进制可执行文件(如/ usr / bin / java)不是可接受的shell脚本,并且您得到上述错误。
可能的解决方案:
/bin/bash -c "java -jar <jar>"
。请注意,包含其参数的整个命令需要作为单个参数传递,因此引用。