【问题标题】:Java ProcessBuilder: environment set correctly but still command not foundJava ProcessBuilder:环境设置正确但仍然找不到命令
【发布时间】:2014-06-02 21:55:21
【问题描述】:

在我正在开发的 Eclipse 插件上使用 Java 的 ProcessBuilder 时遇到问题。 我在调用start()方法之前正确设置了环境,但是运行程序时总是返回command not found错误。

当我通过命令行调用命令时,它运行良好。

当我用我需要的环境启动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 变量的路径...

这段代码有什么问题?

提前谢谢你!

【问题讨论】:

    标签: java path environment-variables processbuilder


    【解决方案1】:

    我认为,您在 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 元素之一中,则可能不切实际。

    【讨论】:

    • 感谢您的回复。但我认为这在可能的情况下是不可能的,因为我想添加到环境 PATH 的路径可能是由用户在运行时添加的......无论如何,如果我理解的话, System.getenv()不能在运行时修改。我弄错了吗?
    • 直到现在我才看到您回复的更新。实际上,在了解 ProcessBuilder 的真正工作原理后,我自己得出了相同的结论(我不得不说,这是基于您的第一个答案)。所以,我们在调用start()之前设置的环境被传递给进程内执行的命令来启动,而not被当前运行在JVM上的进程使用(它负责查找用于启动进程中的命令)。
    猜你喜欢
    • 2018-01-18
    • 2023-03-19
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多