Apache Commons Exec создает слишком много кавычек для аргументов, содержащих пробелы? - PullRequest
10 голосов
/ 08 февраля 2011

Либо есть ошибка в 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 .

Ответы [ 5 ]

6 голосов
/ 29 октября 2012

В Apache common exec есть метод addArgument с флагом handleQuoting.Если он включен, то он заключает аргументы в кавычки.

По умолчанию он включен

public CommandLine addArgument(final String argument, boolean handleQuoting) 
6 голосов
/ 05 июля 2011

Кажется, это реальная ошибка в Apache Commons Exec, которая на сегодняшний день не исправлена.

1 голос
/ 10 июня 2014

Вы можете попробовать следующий пример, он работает для меня:

  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);
0 голосов
/ 10 февраля 2011

Как насчет того, чтобы попробовать это так, как в учебнике , чтобы увидеть, имеет ли это значение?

...
String line = "java what version";
CommandLine cmdLine = CommandLine.parse(line);
executor.execute(cmdLine, resultHandler);
...
0 голосов
/ 08 февраля 2011

Какой класс вы пытаетесь выполнить? Вы не указываете, что именно вы хотите, чтобы Java выполняла. Это должен быть ваш второй аргумент.

Другими словами, если вы пытаетесь запустить com.mycompany.MyExecutable, ваш код должен выглядеть следующим образом:

CommandLine cmdLine = new CommandLine("java com.mycompany.MyExecutable");

Вы можете добавить аргументы после создания объекта CommandLine.

...