Будет ли использование справки Jsch?
Использование JSch поможет, только если вы будете использовать методы канала setInputStream()
и setOutputStream()
вместо метода IOUtils.copy
,так как они управляют копированием в отдельном потоке.
ChannelExec deployWarFile = (ChannelExec)session.openChannel("exec");
deployWarFile.setCommand("/path/to/count-the-bytes");
deployWarFile.setOutputStream(System.out);
deployWarFile.setInputStream(new BufferedInputStream(new FileInputStream(warFile)));
deployWarFile.connect();
(Здесь вам как-то придется ждать, пока другая сторона не закроет канал.)
Если вы просто заменили Runtime.exec
наоткрыв ChannelExec (и запустив его после получения потоков), проблема будет полностью такой же, и ее можно будет решить с помощью того же решения, о котором упоминает antlersoft, то есть закрытия ввода перед чтением вывода:
ChannelExec deployWarFile = (ChannelExec)session.openChannel("exec");
deployWarFile.setCommand("/path/to/count-the-bytes");
OutputStream deployWarFileStdin = deployWarFile.getOutputStream();
InputStream deployWarFileStdout = new BufferedInputStream(deployWarFile.getInputStream());
InputStream warFileInputStream = new FileInputStream(warFile);
deployWarFile.connect();
IOUtils.copy(warFileInputStream, deployWarFileStdin);
deployWarFileStdin.close();
warFileInputStream.close();
IOUtils.copy(deployWarFileStdout, System.out);
deployWarFileStdout.close();
(Конечно, если у вас более длинный вывод, вы захотите выполнять ввод и вывод параллельно или просто использовать первый метод.)