Команды 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.