【问题标题】:Why does my curl command not work with Java ProcessBuilder API为什么我的 curl 命令不适用于 Java ProcessBuilder API
【发布时间】:2016-12-07 06:19:29
【问题描述】:

我想从 Java 中执行以下 CURL 命令:

curl -v -X PUT --data-binary "@configfile.json" -u 用户名:密码 -D /tmp/grabbit_headers http://server:port/grabbit/job

(http:// 和 server... 之间的空格是根据堆栈溢出准则插入的,但不是我的代码的一部分)

我关注了

http://alvinalexander.com/java/java-exec-processbuilder-process-1,进程2和进程3

创建使用 ProcessBuilder API 执行 shell 命令的 java 类。

如果我直接在 shell 上执行 CURL 命令,它会起作用并产生预期的结果。如果我通过 Java 类使用完全相同的命令,它会在没有任何错误的情况下执行,exitCode=0,但不会产生预期的结果。

此处的预期结果是使用 Grabbit (https://github.com/TWCable/grabbit) 将内容从一个 Adob​​e AEM 实例迁移到另一个实例。

这是我的主要方法:

public String processBuilderExample() throws IOException, InterruptedException
{


    // build the system command we want to run
  List<String> commands;
  String result="";      
  /*
   * CURL Commands:
   * curl -v -X PUT --data-binary "@$configpath" -u $username:$password -D /tmp/grabbit_headers $client$GRABBIT_JOB > /tmp/grabbit
   * */
  String curl_command="curl -v -X PUT --data-binary \"@"+this.configpath+"\""+" -u "+this.username+":"+this.password+" -D /tmp/grabbit_headers "+this.client+this.GRABBIT_JOB;

  commands = new ArrayList<String>(Arrays.asList(curl_command.split(" ")));      

  result=runCommand(commands);
  return result;

}

//@Override
public String runCommand(List<String> commands) throws IOException, InterruptedException
{

  // execute the command
  SystemCommandExecutor commandExecutor = new SystemCommandExecutor(commands);
  int result = commandExecutor.executeCommand();

  // get the stdout and stderr from the command that was run
  StringBuilder stdout = commandExecutor.getStandardOutputFromCommand();
  StringBuilder stderr = commandExecutor.getStandardErrorFromCommand();

  StringBuilder finalReturnString=new StringBuilder();
  finalReturnString.append("<br/>STDOUT:<br/>");
  finalReturnString.append(stdout.toString());
  finalReturnString.append("<br/>STDERR:<br/>");
  finalReturnString.append(stderr.toString());

  return finalReturnString.toString();

}

【问题讨论】:

  • 您创建了finalReturnString,但从未将任何输出放入。
  • 只使用 OkHttp,除非你需要一些 curl 怪癖。与可用于 Java 的优秀 HTTP 客户端库相比,为此调用一个进程似乎很痛苦和尴尬。
  • @LukeLee:我已将append 呼叫添加到finalReturnString

标签: java shell curl processbuilder


【解决方案1】:

使用 ProcessBuilder 配置重定向。

">" 重定向是 shell (sh/bash) 的一部分,而不是命令。

如何使用流程构建器进行重定向,请参考Runtime's exec() method is not redirecting the output

请参阅&> redirection not working correctly 了解为什么它不起作用。

【讨论】:

  • 谢谢@Boon。我已经添加了重定向,结果仍然没有改变:ProcessBuilder pb = new ProcessBuilder(commandInformation); pb.redirectOutput(new File("/tmp/grabbit")); Process process = pb.start();
  • 能否请您从 Java 中打印出完整的“命令”并粘贴到此处?
  • 实际上添加 pb.redirectOutput(new File("/tmp/grabbit")); 就可以了。非常感谢!
  • 很高兴它成功了!干杯!您可以将答案标记为正确...看起来您是 StackOverflow 的新手。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 2021-03-11
  • 2023-03-31
  • 2014-08-08
  • 2012-08-11
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多