Либо есть ошибка в 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. Я хочу сказать, что неверный аргумент времени выполнения передается внешнему процессу, содержащему экранированные кавычки, чего не должно быть.
Редактировать: я сделал это полевой ошибкой для exec общин в Jira .