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有addArgument带handleQuotingflag的方法.如果它已打开,则它将参数包装在引号中.
默认情况下,它已打开
public CommandLine addArgument(final String argument, boolean handleQuoting)
Run Code Online (Sandbox Code Playgroud)