以编程方式从Eclipse中获取外部程序的完整路径

时间:2019-03-30 22:22:15

标签: java eclipse

我正在尝试使用以下Java代码获取系统程序的完整路径:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PathExtractor {

    public static void main(String[] args) throws Exception {
        ProcessBuilder processBuilder = new ProcessBuilder("which", "mvn");
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();
        process.waitFor();
        try (BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            System.out.println(in.readLine());
        }
    }
}

从命令行编译并运行时,预期的输出将打印出来:

  

/ usr / local / bin / mvn

但是,当在Eclipse中运行时,我得到具有以下输出的退出值1:

  

经过一番研究,我发现了一个类似的问题,this answer建议启动一个shell来运行前面的命令:

new ProcessBuilder("/bin/sh", "-c", "which mvn")

不幸的是,该命令仍然失败,并显示null输出。请注意,在Windows计算机上,只需使用 new ProcessBuilder(“ where”,“ mvn”)即可达到预期的效果。

如何从Eclipse中以编程方式确定程序的路径?

1 个答案:

答案 0 :(得分:0)

经过一番挖掘,我设法使用以下命令从Eclipse内部以编程方式获取外部程序的完整路径:

new ProcessBuilder("/bin/bash", "-l", "-c", "which mvn")

-l(或--login)标志是解决方案的关键。根据{{​​3}}:

  

让bash就像被作为登录shell调用一样

     

[...]

     

当bash作为交互式登录shell或作为   带有--login选项的非交互式shell,它首先读取并   如果文件/ etc / profile存在,则执行该命令。   读取该文件后,它将查找〜/ .bash_profile,〜/ .bash_login,   和〜/ .profile,按此顺序,并从中读取并执行命令   第一个存在并且可读。

换句话说,这将允许外部程序从标准位置之一拾取PATH变量,即使在Eclipse本身中可以将其设置为其他值。