Java ProcessBuilder可以';在路径中找不到文件
我尝试从java应用程序运行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 + "&
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:
不检查命令是否对应于有效的操作命令
系统命令
因此,您需要在传递给构造函数的字符串中构建卷曲的绝对路径。我发布此答案是因为我无法用所有现有答案解决此问题: 这是任何初学者的答案之一。(主要是所有现有答案的组合)
curl
。(按照谷歌安装)curl
bin
路径添加到环境系统变量processBuilder
使用的路径中没有CURL。重新启动修复了它)这就是问题中最初错误的原因
System.getenv(“PATH”)
对代码进行验证POST
,请确保在运行WINDOWS时转义POST负载。在MAC中运行时不会逃逸。我真的不知道这个问题,但调试花了很多时间。
转义:
“
with\”
那么,你是说我必须调用cmd.exe
并以某种方式作为参数给他我的curl命令?这是选项之一,是的。路径应该在传递给cmd的环境中。老实说,我不明白你说的一半,我对这个有点陌生。你能举个例子吗?增加了一个方法来找到完整的路径。