У меня есть два вызова, которые я выполняю с помощью CommonsExec - один из них - стандартный синхронный вызов, в котором я вызываю пакетный файл для компиляции проекта maven, а следующий - асинхронный вызов также для пакета файл, который запускает скомпилированный проект командной строки.Apache CommonsExec асинхронный вызов, предотвращающий вызов синхронизации
Пакетные файлы Maven выглядеть
call mvn package
Это делается в два раза, чтобы скомпилировать и запустить две программы.
Это работает отлично в первый раз, но второй вызов сборки синхронизации по какой-то причине не возвращается, хотя выведенный в журнал вывод показывает, что сборка завершена успешно. Программа, очевидно, не запускается.
Я также могу воссоздать это, выполнив прогон, а затем скомпилировать - кажется, что пока выполняется асинхронный вызов, синхронный вызов не будет завершен.
Может кто поможет здесь?
Код для вышеперечисленного
private static final String LAUNCH_CLIENT_FORMAT = "\"%s\\start.bat\" http://localhost:%d" + ENDPOINT;
private static final String COMPILE_FORMAT = "\"%s\\compile.bat\"";
private static boolean compileAndLaunch(String aiDirectory, int port) {
System.out.println("Compiling " + aiDirectory + " for port " + port);
if (!run(String.format(COMPILE_FORMAT, aiDirectory), aiDirectory))
return false;
System.out.println("Done compiling " + aiDirectory + " for port " + port + ", launching...");
if (!runAsync(String.format(LAUNCH_CLIENT_FORMAT, aiDirectory, port), aiDirectory))
return false;
return true;
}
private static boolean run(String command, String directory) {
DefaultExecutor executor = getExecutor(directory);
System.out.println("Running " + command);
CommandLine commandLine = CommandLine.parse(command);
try {
executor.execute(commandLine);
}
catch (ExecuteException e) {
System.out.println("Failed to execute " + command);
return false;
}
catch (IOException e) {
System.out.println("IO Exception running " + command);
return false;
}
return true;
}
private static DefaultExecutor getExecutor(String directory) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
DefaultExecutor executor = new DefaultExecutor();
executor.setWorkingDirectory(new File(directory));
executor.setStreamHandler(streamHandler);
return executor;
}
private static boolean runAsync(String command, String directory) {
CommandLine commandLine = CommandLine.parse(command);
System.out.println("Running async " + command);
DefaultExecutor executor = getExecutor(directory);
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
try {
executor.execute(commandLine, resultHandler);
}
catch (ExecuteException e) {
System.out.println("Failed to execute " + command);
return false;
}
catch (IOException e) {
System.out.println("IO Exception running " + command);
return false;
}
return true;
}
'но второй вызов построения синхронизации не возвращается' - вы имеете в виду асинхронный здесь? Не стесняйтесь включать свой код, иначе ответы просто догадываются о том, что вы делаете. –
Эй - Я строю синхронно, а затем запускаю программу асинхронно. Вторая сборка не заканчивается, хотя на выходе отображается BUILD SUCCESSFUL. Я добавлю код. –
Выполняют ли два набора командных файлов в одном каталоге? Может ли это быть тупиком в самом maven? Что произойдет, если вы запустите четыре команды из командной строки в той же последовательности. Я не мог воспроизвести проблему, когда я заменил сборку просто вызовом «sleep x». Тогда вторая синхронная команда будет работать без проблем, пока предыдущая асинхронная команда все еще работает. Заставляет меня думать, что тупик находится в пакетных сценариях или в maven. – Keith