【问题标题】:Running a process inside a folder on Linux in Java用 Java 在 Linux 上的文件夹内运行进程
【发布时间】:2019-01-22 12:47:20
【问题描述】:

所以我有一个运行并读取命令行 Linux 应用程序输出的 JAR 程序。这个应用程序位于我的 JAR 所在的临时文件夹中。

这是用于读取输出的 Java 代码:

Process proc;
ProcessBuilder pb = new ProcessBuilder();
pb.command("temp/myapp", "arg1");
pb.redirectErrorStream(true);
try {
     proc = pb.start();
} catch (IOException ex) {
    System.out.println("ERROR: Couldn't start process");
}
scan = new Scanner(proc.getInputStream());
String line = "";
while (scan.hasNext())
      line += scan.nextLine() + System.lineSeparator();
scan.close();

稍后我当然会返回我读到的字符串。

现在,问题是 Scanner 抛出 NullPointerException,这意味着找不到或无法运行该进程。 我将可执行文件从临时文件中取出并使用的那一刻

pb.command("./myapp", "arg1");

我的程序运行良好。

如果我打开 JAR 所在的终端,temp/myapp arg1 将完全返回它应该返回的内容。只有 Java 代码似乎无法在 temp 中运行。

问题是,如果不是我上面描述的方式,我如何指向 temp 中的 CLI 应用程序?

PS:Java 应用程序在 Windows 上使用相同的设置,使用 pb.command("temp/myapp", "arg1") 和 myapp 的 Win 版本,所以这是一个特定于 Linux 的问题。

【问题讨论】:

  • 命令行程序是脚本还是编译程序?
  • 一个编译好的程序。如果它是一个脚本,我可能应该用 shell 运行它。

标签: java linux process directory processbuilder


【解决方案1】:

我认为它没有在各自的路径上获得进程。尝试通过给出进程的绝对路径然后执行。希望它会起作用。

【讨论】:

    【解决方案2】:

    我找到了解决办法。

    ProcessBuilder 的 directory() 方法,我也在某处使用,它不仅设置进程的工作目录,还设置进程启动的目录,至少在 Linux 上,所以我的代码实际上是如何解析的Linux 是temp/temp/myapp。当我将 temp 设置为工作目录时,我只需要使用 ./myapp 从 temp 启动它。在 Windows(我的主要平台)上,情况并非如此,我仍然必须在 command() 中使用 pass temp/myapp 作为参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多