Java ProcessBuilder无法在PATH中找到文件

时间:2015-03-27 11:58:57

标签: java curl

我尝试从我的java应用程序运行curl。这是我的代码:

ProcessBuilder pb = new ProcessBuilder("curl",
                    "-T",
                    "\"" + tmp_dir + "client-" + node_id + ".war\"",
                    "\"" + tomcat_url + "/deploy?path=/client" + node_id + "&update=true\"");
Process p = pb.start();

然而,它给出了例外:

java.io.IOException: Cannot run program "curl": CreateProcess error=2, The system cannot find the file specified

curl位于我的系统路径和用户路径中,当我从curl运行cmd时,它完美运行:

enter image description here

此外,当我向ProcessBuilder提供curl可执行文件的绝对路径时,它可以正常工作,但我不想这样做,因为我的代码应该与curl目录一起使用'安装到

我做错了什么?

3 个答案:

答案 0 :(得分:1)

shell(或命令处理器)在PATH变量中定义的目录中定位文件。

只是启动一个带有命令路径和参数列表的子进程不会通过shell,除非你明确地对它进行编码。

如果无法将curl的确切位置卸载到某个系统属性中,则可能必须解释PATH并尝试所有目录,然后使用完整路径名调用。

public static Path findAbsolutePath( String curl ){
  String path = System.getenv( "PATH" );
  String[] dirs = path.split( ";" );
  for( String dir: dirs ){
    Path toCurl = Paths.get( dir, curl );
    File curlFile = new File( toCurl.toString() );
    if( curlFile.canExecute() ) return toCurl;
  }
  return null;
}

或者致电命令处理器。

答案 1 :(得分:0)

ProcessBuilder#ProcessBuilder(String... command) javadoc:

  

不检查命令是否对应于有效操作   系统命令。

因此,您需要在传递给构造函数的字符串中构建卷曲的绝对路径。

答案 2 :(得分:0)

我发布此答案是因为我无法使用所有现有答案解决此问题:

这是任何初学者的答案之一(主要是所有现有答案的组合)。

  1. 在Windows计算机中,确保已安装curl。 (跟随Google安装)
  2. 确保将curl bin路径添加到环境系统变量
  3. 重新启动机器。 (重要!。因为我花了很多时间,因为processBuilder使用的PATH中没有CURL。重新启动已对其进行修复。)这是问题中原始错误的原因。 / li>
  4. 您可以使用System.getenv( "PATH" )来验证代码。

插件:如果您使用的是POST,请确保通过WINDOWS运行时转义了有效载荷。通过MAC运行时不会逃脱。我真的不知道这个问题,但是调试花费了很多时间。 从某种意义上逃脱:"\"