Rozpoczęcie procesu w następujący sposób.Przekierowanie operacji wejścia/wyjścia podprocesu w Javie (dlaczego proces ProcessBuilder.inheritIO() nie działa?)
try {
final Process mvnProcess = new ProcessBuilder("cmd", "/c", "mvn", "--version")
.directory(new File(System.getProperty("user.dir")))
.inheritIO()
.start();
System.exit(mvnProcess.waitFor());
} catch (final IOException ex) {
System.err.format(IO_EXCEPTION);
System.exit(1);
} catch (final InterruptedException ex) {
System.err.format(INTERRUPTED_EXCEPTION);
System.exit(1);
}
Odkąd powołać inheritIO()
Spodziewałem wyjście Sub-process jest na konsoli, ale nic nie pojawia. Czego tu mi brakuje?
Edit: wiem, że mogę używać mvnProcess.getInputStream()
i czytać wyjście procesu jest wyraźnie, pisząc go do konsoli (lub w ogóle), w pętli. Nie podoba mi się to rozwiązanie, ponieważ pętla zablokuje mój wątek. inheritIO()
wyglądał obiecująco, ale najwyraźniej nie rozumiem, jak to działa. Miałem nadzieję, że ktoś tutaj może rzucić trochę światła na to.
Co się stanie, jeśli w pliku cmd.exe wykonasz 'mvn --version> somefile.txt'? – ARRG
@ARRG Dostaję plik o nazwie somefile.txt z informacjami o wersji dla maven – Rinke
1) Przeczytaj (i zaimplementuj) * wszystkie * zalecenia [Kiedy Runtime.exec() nie będzie] (http://www.javaworld.com /jw-12-2000/jw-1229-traps.html). To może rozwiązać problem. Jeśli nie, powinien podać więcej informacji na temat przyczyny niepowodzenia. Następnie zignoruj, że odnosi się do 'exec' i (kontynuuj) buduj' Process' używając 'ProcessBuilder'. 2) Zmień kod postaci 'catch (Exception e) {..' na' catch (Exception e) {e.printStackTrace(); // bardzo informujące! ..' –