在Java中是否有一种platform-independent方式来启动一个外部进程来执行它使用系统路径找到的程序
它至少应该在Windows、Linux和Mac上工作。
通常,您必须给出可执行文件的完整路径,如下所示:
new ProcessBuilder("/some/path/execfile", "arg").start();可以通过启动shell来启动系统路径上的程序:
new ProcessBuilder("/bin/bash", "-c", "execfile", "arg").start();但这在OS:s之间是不可移植的(这是提供给this question的解决方案)。
发布于 2022-08-24 16:31:19
ProcessBuilder确实使用了$PATH。
import java.io.*;
public class ProcessBuilderTest {
public static void main(String... args) throws Exception {
ProcessBuilder pb = new ProcessBuilder(args);
pb.redirectErrorStream(true);
Process p = pb.start();
int exitCode = p.waitFor();
printStream(p.getInputStream());
printStream(p.getErrorStream());
System.out.println("Exit code: " + exitCode);
}
static void printStream(InputStream stream) throws IOException {
try (BufferedReader br = new BufferedReader(new InputStreamReader(stream))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
}在MacOS上运行此命令:
robert@mac:~$ java ProcessBuilderTest.java ls *.java
ProcessBuilderTest.java
Exit code: 0
robert@mac:~$ java ProcessBuilderTest.java ls *.class
ls: cannot access '*.class': No such file or directory
Exit code: 2
robert@mac:~$ java ProcessBuilderTest.java which ls
/usr/local/opt/coreutils/libexec/gnubin/ls
Exit code: 0
robert@mac:~$在Linux上也是如此:
robert@linux:~$ java ProcessBuilderTest.java ls *.java
ProcessBuilderTest.java
Exit code: 0
robert@linux:~$ java ProcessBuilderTest.java ls *.class
ls: cannot access '*.class': No such file or directory
Exit code: 2
robert@linux:~$ java ProcessBuilderTest.java which ls
/usr/bin/ls
Exit code: 0
robert@linux:~$我不使用Windows,所以不能对其进行测试。
https://stackoverflow.com/questions/73474171
复制相似问题