我尝试从我的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
时,它完美运行:
此外,当我向ProcessBuilder提供curl
可执行文件的绝对路径时,它可以正常工作,但我不想这样做,因为我的代码应该与curl
目录一起使用'安装到
我做错了什么?
答案 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)
我发布此答案是因为我无法使用所有现有答案解决此问题:
这是任何初学者的答案之一(主要是所有现有答案的组合)。
curl
。 (跟随Google安装)curl
bin
路径添加到环境系统变量processBuilder
使用的PATH
中没有CURL。重新启动已对其进行修复。)这是问题中原始错误的原因。 / li>
System.getenv( "PATH" )
来验证代码。 插件:如果您使用的是POST
,请确保通过WINDOWS运行时转义了有效载荷。通过MAC运行时不会逃脱。我真的不知道这个问题,但是调试花费了很多时间。
从某种意义上逃脱:"
与\"
。