Apache Commons Exec为包含空格的参数生成了太多引号?

roe*_*erj 10 java apache-commons-exec

要么Apache Commons Exec中存在错误,要么我错误地使用API​​,但是当我使用CommandLine类添加包含空格的参数时,会添加一些引号,然后是给定参数的一部分.

例如:当我打电话java "what version",我得到java.lang.NoClassDefFoundError: what version了,当我打电话java "\"what version\""(其中包含转义引号,是命令行参数本身的一部分),我得到java.lang.NoClassDefFoundError: "what version".

因此,以下测试失败,因为正如您在最后一行中所看到的,Apache Exec正在生成后者版本,它应该生成第一个版本:

@Test
public void testArgumentQuoting() throws Exception {
    DefaultExecutor executor = new DefaultExecutor();
    DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    PumpStreamHandler streamHandler = new PumpStreamHandler(out, out);
    executor.setStreamHandler(streamHandler);
    CommandLine cmdLine = new CommandLine("java");
    cmdLine.addArgument("what version");
    executor.execute(cmdLine, resultHandler);
    resultHandler.waitFor();
    String resultPattern = "Exception in thread \"main\" java\\.lang\\.NoClassDefFoundError: ([\\w \"]+)";
    Pattern pattern = Pattern.compile(resultPattern);
    Matcher matcher = pattern.matcher(out.toString());
    Assert.assertTrue(matcher.find());
    // Note: Result should be <what version> and NOT <"what version">!
    Assert.assertEquals("what version", matcher.group(1));
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道:

  • 这是一个错误吗?
  • 如果是这样的话:有没有办法规避这个问题(一种解决方法)?
  • 如果不是:我做错了什么?

编辑:我正在尝试执行一个我认为人们在他们的机器上最少的过程.所以我正在使用,java因为这个命令应该在人们开发Java的所有机器上都可用.我的观点是错误的运行时参数传递给外部进程,包含转义引号,但它不应该.

编辑:我把它变成了Jira的公共执行官提交的错误.

小智 7

Apache common exec有addArgumenthandleQuotingflag的方法.如果它已打开,则它将参数包装在引号中.

默认情况下,它已打开

public CommandLine addArgument(final String argument, boolean handleQuoting) 
Run Code Online (Sandbox Code Playgroud)


roe*_*erj 6

这似乎是Apache Commons Exec中的一个真正的错误,到目前为止还没有修复.