Apache Commons Exec 中存在错误,或者我使用的 API 有误,但是当我使用 CommandLine
类添加包含空格的参数时,添加了一些引号,然后给出的论证的一部分。
例如:当我调用 java "what version"
时,我得到 java.lang.NoClassDefFoundError: what version
,当我调用 java "\"什么版本\""
(包含转义引号,它们是命令行参数本身的一部分),我得到 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));
}
现在我想知道:
- 这是一个错误吗?
- 如果是这样:是否有办法规避此问题(解决方法)?
- 如果不是:我做错了什么?
编辑:我正在尝试执行一个我认为最少的人会在他们的机器上执行的过程。所以我改用 java
因为这个命令应该在人们开发 Java 的所有机器上都可用。我的观点是错误的运行时参数被传递给外部进程,包含转义引号,这是不应该的。
编辑:我在 Jira 将其作为 commons exec 的已归档错误.
最佳答案
Apache common exec 具有带有 handleQuoting
标志的 addArgument
方法。
如果它已打开,则会将参数用引号引起来。
默认开启
public CommandLine addArgument(final String argument, boolean handleQuoting)
关于java - Apache Commons Exec 为包含空格的参数生成太多引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927226/