2014-04-18 33 views
2

我在开发Eclipse插件时遇到了Java的ProcessBuilder问题。 我在调用start()方法之前正确地设置了环境,但是当我运行该程序时,它总是返回一个未找到命令的错误。Java ProcessBuilder:环境设置正确,但仍然没有找到命令

当我通过命令行调用命令时,它完美地工作。

当我根据需要用环境启动eclipse时,找到该命令并且程序正常工作。

只有当我以编程方式设置环境时,程序将失败。

以下是我有:

ProcessBuilder pb = new ProcessBuilder("my_command", file, output); 
Map<String, String> env = pb.environment(); 
env.put("PATH", env.get("PATH") + File.pathSeparator + env1 + File.pathSeparator + env2); 
Process p = pb.start(); 
... 

其中,env1env2是我想要添加到PATH变量的路径...

什么是错误的代码?

预先感谢您!

回答

3

我认为,您在ProcessBuilder上设置的环境只是传递给新过程的内容,而不是构建器本身使用的内容。尝试设置您的Java进程的environment variables,然后尝试启动新进程。

编辑:

看到,它可能无法改变Java进程的环境,我相信你必须想出一些变通。

当你已经知道的路径()你正在寻找你当然可以弄清楚的完整路径来"my_command"自己,大概这样:

String commandString; 

if (new File(env1 + "/my_command").isFile()) { 
    commandString = env1 + "/my_command"; 
} else 
if (new File(env2 + "/my_command").isFile()) { 
    commandString = env2 + "/my_command"; 
} 

ProcessBuilder pb = new ProcessBuilder(commandString, file, output); 

可能是不切实际不过,如果"my_command"可能已经在其中一个用户的PATH元素中。

+0

感谢您的回复。但我认为这是不可能的,因为我想添加到环境路径中的路径可能会在运行时被用户添加...无论如何,如果我明白,System.getenv()不能在运行时修改。我错了吗? – pnpo

+0

感谢您的更新! – pnpo

+0

只有现在我已经看到你的回复这个更新。实际上,在了解了ProcessBuilder的真实工作方式(我不得不说,它是基于您的第一个答案)之后,我自己也得出了相同的结论。因此,我们在调用'start()'之前设置的环境被传递给在启动过程中执行的命令并且** not **被当前在JVM上运行的进程使用(它负责查找为进程中的命令启动)。 – pnpo

相关问题