Команды git через cmd в java и получают весь вывод консоли

Я хочу выполнять команды git через cmd в Java и хочу проверить весь полученный вывод. Ожидаемое:

Клонирование в "Гитрепо"...

дистанционный: Подсчет объектов: 92, сделано

удаленный: Поиск источников: 100% (92/92)

дистанционный: получение размеров: 100% (76/76)

удаленный: сжатие объектов: 98% (2370/2400)

удаленный: всего 92 (дельта 14), повторно используется 89 (дельта 14)

Распаковка предметов: 100% (92/92), сделано.

Проверка подключения... сделано.

Попробуйте № 1 - ProcessBuilder

        List<String> commands = new ArrayList<String>();
        commands.add("cmd.exe");
        commands.add("/k");
        commands.add("cd D:/" + " && D: && git clone --depth 1 <url>");
        ProcessBuilder pb = new ProcessBuilder(commands);
        pb.redirectErrorStream(true);

        Process prs = pb.start();
        prs.waitFor();
        BufferedReader input = new BufferedReader(new InputStreamReader(prs.getInputStream()));

        String line = null;
        while((line = input.readLine())!= null) {
            output = output + line;
            System.out.println(line);
        }
        System.out.println(output);
        // final String fileAsText = input.lines().collect(Collectors.joining());
        //System.out.println(fileAsText);

        input.close();

Результат: зависает во время цикла

Попробуйте № 2 - Сканер в новой теме

        ProcessBuilder proc = new ProcessBuilder(commands);
        proc. redirectErrorStream(true);
        proc.redirectOutput();
        final Process p = proc.start();//Runtime.getRuntime().exec(cur_string);
        //Handle streams
        //in

        new Thread(new Runnable(){
               public void run(){
                    Scanner stdin = new Scanner(p.getInputStream());
                    while(stdin.hasNextLine()){
                                System.out.println(stdin.nextLine());
                                if (stdin.nextLine().isEmpty())
                                    break;
                    }
                    System.out.println("exit");
                    stdin.close();
                    }
            }).start();

      //wait
      p.waitFor();
      p.destroyForcibly();

Результат - зависает в то время как Loop

Попробуйте № 3 - Runnable Class

        public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        List<String> commands = new ArrayList<String>();
            commands.add("cmd.exe");
            commands.add("/k");
            commands.add("cd D:/" + " && D: && git clone --depth 1 <url>");
        ProcessBuilder pb = new ProcessBuilder(commands);
        pb.redirectErrorStream(true);
            try {

             Process prs = pb.start();
             Thread inThread = new Thread(new In(prs.getInputStream()));
             inThread.start();
             Thread.sleep(2000);


            } catch (IOException e) {
             e.printStackTrace();
            }
        }


        class In implements Runnable {
        private InputStream is;

        public In(InputStream is) {
        this.is = is;
        }

            @Override
            public void run() {
                byte[] b = new byte[1024];
                int size = 0;
                try {
                    while ((size = is.read(b)) != -1) {
                    System.out.println(new String(b));
                }
                is.close();
                } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                }

            }
        }

Результат-- Никогда не возвращается

Попробуйте № 4 - org.apache.commons.fileupload.utils.stream

        final Process _p = Runtime.getRuntime().exec("cmd.exe /k cd \"D:\\" && D: && git clone --depth 1 <url>");

        // Handle stdout...
        new Thread() {
            public void run() {
                try {
                Streams.copy(_p.getInputStream(), System.out,true);
                } catch (Exception anExc) {
                anExc.printStackTrace();
                }
            }
        }.start();

        // Handle stderr...
        new Thread() {
            public void run() {
            try {
                Streams.copy(_p.getInputStream(), System.out,true);
            } catch (Exception anExc) {
                anExc.printStackTrace();
            }
            }
        }.start();
        _p.waitFor();

Результат - висит навсегда

Попробуйте № 5 - Crydust / Git.java

https://gist.github.com/Crydust/fd1b94afc52cd0f7dd4c

Результат - вернуть только первое утверждение "Клонирование в git.repo..."

Попробуйте № 6 --apache.commomns.executor (Executor Watch dog)

Результат - зависает

Попробуйте № 7 - библиотека ztexec

        String output = new ProcessExecutor().command("git", "clone","--depth","1","url")
        .readOutput(true).directory(new File("D:/git")).execute()
        .outputUTF8();  
        System.out.println(output);

Результат - вернуть только первое утверждение "Клонирование в git.repo..."

Примечание::: Не использовать библиотеку jgit, потому что требуется мелкое клонирование, которое еще не поддерживается в jgit.

0 ответов

Другие вопросы по тегам