4

你必须在 Java 中做什么才能让 Runtime.exec() 运行路径上的程序?我正在尝试运行已放入路径 (/usr/local/bin) 的 gpsbabel。

public class GpxLib {

    public static void main(String[] args) {
        try
        {
            Runtime r = Runtime.getRuntime();
            Process p = r.exec("gpsbabel -i garmin -f usb: -o gpx -F -");
            InputStream is = p.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while (true)
            {
                String s = br.readLine();
                if (s == null)
                    break;
                System.out.println(s);
            }
            br.readLine();
        } catch (IOException e) {
            e.printStackTrace(System.err);
        }
    }
}
4

3 回答 3

3

我添加了一个System.out.println(System.getenv("PATH"));只打印出来的调用

/usr/bin:/bin:/usr/sbin:/sbin

所以由于某种原因 /usr/local/bin 没有出现。看起来这是一个 MacOSX 问题或 Eclipse 问题,而不是 Java 问题。编辑:改为在超级用户上问这个问题。

于 2009-08-23T19:18:14.663 回答
2

它将继承 Java 进程的路径。因此,无论 Java 进程有什么环境,派生的进程也将有。以下是检查环境的方法:

Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
     System.out.format("%s=%s%n", envName, env.get(envName));
}

你设置PATH 导出了吗?如果您不导出它,那么它对子流程不可用。

此外,您必须同时使用 stdout 和 stderr,以防止阻塞。否则在某些情况下东西会起作用,然后你的衍生进程将输出不同数量的数据,一切都会停止。

有关更多详细信息,请参阅此答案

于 2009-08-23T19:15:45.527 回答
2

这是解决方案:

ProcessBuilder proc = new ProcessBuilder("<Directory PAth>" + "Executable.exe");
proc.redirectOutput(ProcessBuilder.Redirect.INHERIT);
proc.directory(fi); //fi = the output directory path
proc.start();

是程序\应用程序的可执行文件所在的路径,例如“C:\MyProg\”

于 2013-09-26T11:16:32.397 回答