Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ProcessBuilder可以';在路径中找不到文件_Java_Curl - Fatal编程技术网

Java ProcessBuilder可以';在路径中找不到文件

Java ProcessBuilder可以';在路径中找不到文件,java,curl,Java,Curl,我尝试从java应用程序运行curl。这是我的密码: ProcessBuilder pb = new ProcessBuilder("curl", "-T", "\"" + tmp_dir + "client-" + node_id + ".war\"", "\"" + tomcat_url + "/deploy?path=/client" + node_id + "&

我尝试从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
在我的系统路径和用户路径中,当我从
cmd
运行
curl
时,它工作得非常好:

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

我做错了什么

是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;
}
或者调用命令处理器。

javadoc:

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


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

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

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

  • 在Windows计算机中,确保安装了
    curl
    。(按照谷歌安装)
  • 确保将
    curl
    bin
    路径添加到环境系统变量
  • 重新启动机器。(重要!。因为我花了很多时间,因为
    processBuilder
    使用的
    路径中没有CURL。重新启动修复了它)这就是问题中最初错误的原因
  • 您可以使用
    System.getenv(“PATH”)
    对代码进行验证
  • 加载项:如果使用的是
    POST
    ,请确保在运行WINDOWS时转义POST负载。在MAC中运行时不会逃逸。我真的不知道这个问题,但调试花了很多时间。
    转义:
    with
    \”

    那么,你是说我必须调用
    cmd.exe
    并以某种方式作为参数给他我的curl命令?这是选项之一,是的。路径应该在传递给cmd的环境中。老实说,我不明白你说的一半,我对这个有点陌生。你能举个例子吗?增加了一个方法来找到完整的路径。