我正在尝试使用以下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中以编程方式确定程序的路径?
答案 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本身中可以将其设置为其他值。