要么是 Apache Commons Exec 中存在错误,要么是我使用了错误的 API,但是当我使用CommandLine
类来添加包含空格的参数,添加一些引号,然后它们成为给定参数的一部分。
例如:当我打电话时java "what version"
I get 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));
}
现在我想知道:
- 这是一个错误吗?
- 如果是这样:有没有办法绕过这个问题(解决方法)?
- 如果不是:我做错了什么?
编辑:我正在尝试执行一个我认为最少人会在他们的机器上执行的过程。所以我正在使用java
相反,因为该命令应该在人们开发 Java 的所有机器上都可用。我的观点是,错误的运行时参数被传递给外部进程,其中包含转义的引号,这是不应该的。
编辑:我将此作为 commons exec 的已提交错误Jira.
Apache 常见的 exec 有addArgument
方法与handleQuoting
旗帜。
如果它已打开,则会将参数括在引号中。
默认情况下它是打开的
public CommandLine addArgument(final String argument, boolean handleQuoting)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)