Java lang.process运行jar“/ usr / bin / java:无法执行二进制文件”

时间:2015-01-06 15:38:12

标签: java

我试图运行一个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在使用上面代码中执行的相同命令从终端运行时运行正常。

1 个答案:

答案 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脚本,并且您得到上述错误。

可能的解决方案:

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