运行 Java Linux 上的文件夹内的进程
Running a process inside a folder on Linux in Java
所以我有一个 JAR 程序 运行s 并读取命令行 Linux 应用程序的输出。这个应用程序位于一个临时文件夹中,我的 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();
后来我 return 我当然读入了那个字符串。
现在,问题是Scanner抛出一个NullPointerException,这意味着进程找不到或者不能运行。
当我从临时文件中取出可执行文件并使用
pb.command("./myapp", "arg1");
我的程序运行良好。
如果我打开 JAR 所在的终端,temp/myapp arg1
将 return 完全按照它应该的方式运行。只有 Java 代码似乎无法 运行 这个内部温度。
问题是,如果不是我上面描述的方式,我该如何指向 temp 中的 CLI 应用程序?
PS:Java 应用程序在相同设置中的 Windows 上运行,使用 pb.command("temp/myapp", "arg1") 和myapp
的 Win 版本,因此这是 Linux 特定的问题。
我认为它没有在各自的路径上获取进程。尝试给出进程的绝对路径,然后执行。希望有用。
我找到了解决方案。
ProcessBuilder 的 directory() 方法,我也在某处使用过,它不仅设置进程的工作目录,而且至少在 Linux 上设置进程将从中启动的目录,那么如何我的代码实际上在 Linux 上被解析为 temp/temp/myapp
。当我将 temp 设置为工作目录时,我只需要使用 ./myapp
从 temp 启动它。在 Windows(我的主要平台)上,情况并非如此,我仍然必须使用 pass temp/myapp
作为 command() 中的参数。
所以我有一个 JAR 程序 运行s 并读取命令行 Linux 应用程序的输出。这个应用程序位于一个临时文件夹中,我的 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();
后来我 return 我当然读入了那个字符串。
现在,问题是Scanner抛出一个NullPointerException,这意味着进程找不到或者不能运行。 当我从临时文件中取出可执行文件并使用
pb.command("./myapp", "arg1");
我的程序运行良好。
如果我打开 JAR 所在的终端,temp/myapp arg1
将 return 完全按照它应该的方式运行。只有 Java 代码似乎无法 运行 这个内部温度。
问题是,如果不是我上面描述的方式,我该如何指向 temp 中的 CLI 应用程序?
PS:Java 应用程序在相同设置中的 Windows 上运行,使用 pb.command("temp/myapp", "arg1") 和myapp
的 Win 版本,因此这是 Linux 特定的问题。
我认为它没有在各自的路径上获取进程。尝试给出进程的绝对路径,然后执行。希望有用。
我找到了解决方案。
ProcessBuilder 的 directory() 方法,我也在某处使用过,它不仅设置进程的工作目录,而且至少在 Linux 上设置进程将从中启动的目录,那么如何我的代码实际上在 Linux 上被解析为 temp/temp/myapp
。当我将 temp 设置为工作目录时,我只需要使用 ./myapp
从 temp 启动它。在 Windows(我的主要平台)上,情况并非如此,我仍然必须使用 pass temp/myapp
作为 command() 中的参数。