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));
}
现在我想知道:
编辑:我正在尝试执行一个我认为人们在他们的机器上最少的过程。所以我使用的是java
,因为这个命令应该可以在人们开发Java的所有机器上使用。我的观点是错误的运行时参数传递给外部进程,包含转义引号,不应该这样。
编辑:我在Jira为公共行政人员提出了这个提交的错误。
答案 0 :(得分:6)
这似乎是Apache Commons Exec中的real bug,到目前为止还没有修复。
答案 1 :(得分:6)
Apache common exec具有addArgument
标记handleQuoting
的方法。
如果它已打开,则它将参数包装在引号中。
默认情况下已开启
public CommandLine addArgument(final String argument, boolean handleQuoting)
答案 2 :(得分:1)
你可以尝试下一个适合我的例子:
CommandLine cmdLine = new CommandLine("mco");
cmdLine.addArgument("shellcmd" );
cmdLine.addArguments( puppetAgents.split(" ") );
cmdLine.addArgument("-t");
cmdLine.addArgument(timeout);
// When writing a command with space use double "
cmdLine.addArgument("\"\"puppet agent -t\"\"",false);
答案 3 :(得分:0)
你想要执行什么课?您没有准确指定您希望Java执行的内容。这需要成为你的第二个论点。
换句话说,如果您尝试运行com.mycompany.MyExecutable,您的代码应如下所示:
CommandLine cmdLine = new CommandLine("java com.mycompany.MyExecutable");
您可以在创建CommandLine对象后附加参数。
答案 4 :(得分:0)
如同在tutorial中一样尝试这样做,看看是否有所作为?
...
String line = "java what version";
CommandLine cmdLine = CommandLine.parse(line);
executor.execute(cmdLine, resultHandler);
...