簡體   English   中英

在 PATH 上啟動程序的獨立於平台的方式?

[英]Platform-independent way to start program on PATH?

Java 中是否有一種獨立於平台的方式來啟動一個外部進程來執行它使用系統路徑找到的程序?

它至少應該在 Windows、Linux 和 Mac 上工作。


通常,您必須提供可執行文件的完整路徑,如下所示:

new ProcessBuilder("/some/path/execfile", "arg").start();

可以通過啟動 shell 來啟動系統路徑上的程序:

new ProcessBuilder("/bin/bash", "-c", "execfile", "arg").start();

但這在 OS:s 之間是不可移植的。 (這是給這個問題的解決方案。)

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,所以無法對此進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM