Одна и та же команда запускается через bash, и Java-интерфейс ProcessBuilder Java получает другой вывод - PullRequest
0 голосов
/ 03 октября 2019

Итак, я пытаюсь запустить команду Git через Java. В настоящее время я работаю в Windows с интерфейсом git bash и установленной Java 8.

Когда я запускаю эту команду через git bash: git --git-dir=PathToMyGitRepo log --pretty=format:'{"commit":"%H"},%n', я получаю вывод в формате JSON всех моих журналов в этом хранилище, таким образом делаяразбирать легко. Сгенерированный JSON выглядит следующим образом

{"commit":"SHA1"},
{"commit":"SHA2"}, 
...

Итак, я перенес команду в свое приложение Java и использовал API ProcessBuilder для запуска предыдущей команды. Команда выполняется без каких-либо исключений, но выходные данные, которые я получаю с помощью метода getInputStream, возвращают что-то вроде

'{commit:SHA1},''{commit:SHA2},'

, которое не является допустимой строкой JSON. Одиночные кавычки были сохранены, двойные кавычки были брошены, даже символы следующей строки были несколько потеряны.

Я попытался напечатать ту же самую команду, просто перед тем, как ProcessBuilder запустил ее, а затем запустил сам. Даже перенаправленный вывод команды в файл через bash и через Java дает разные результаты.

Кто-то знает, что здесь происходит? Я подозреваю, что Java запускает какие-то настройки и запускает внешнюю программу, но я не понимаю, как это повлияет на вывод указанной программы.

-----------------------------------------------------------------РЕДАКТИРОВАТЬ------------------------------------------------------------

Итак, по запросу это код кода того, как я получаю InputStream:

BufferedInputStream bis = null
try{
    List<String> gitCommand = new ArrayList<>(Arrays.asList("git", "--git-dir=PathToMyGitRepo", "log", "--pretty=format:'{\"commit\":\"%H\"},%n'"));
    Process p = new ProcessBuilder(gitCommand).start();
    bis = (BufferedInputStream) p.getInputStream();
    String buff = "";
    String JSON = "";
    BufferedReader reader = new BufferedReader(new InputStreamReader(bis));
    while((buff = bis.readLine())!=null){
        JSON += buff;
    }
    System.out.println(JSON);
}catch(IOException ex){
  ...
}

Я несделайте что-нибудь кроме разбора строки JSON, которую я получу. Но тогда я получаю ParsingError: Unexpected character (') at position 1.. Я использую библиотеку SimpleJSON для своих вещей, связанных с JSON.

1 Ответ

0 голосов
/ 03 октября 2019

Я предполагаю, что вы не конвертировали его правильно. Java запускает оболочку внизу, и последняя может вырезать кавычки перед выполнением вашей команды. В зависимости от оболочки, это может позволить вам избежать кавычек. Вы можете сохранить их, используя достаточно обратной косой черты в командной строке Java, что-то вроде "git...{\\\"command\\\"..." или даже больше обратной косой черты, или комбинацию одинарных и двойных кавычек.

Чтобы сделать жизнь портативнее и проще, предлагаю забыть о кавычках и поместить их в результат. Например, вы можете передать другой символ: --pretty=format:'{=commit=:=%H=},%n, а затем просто запустить result.replaceAll("=","\""); или что-то еще

...