2015-06-17 2 views
1

У меня есть jar, который преобразует один XML в другой формат XML, используя XSLT в Java. Ящик копирует вывод в какую-либо папку. Он работает абсолютно нормально, когда я запускаю его в командной строке, но запускаю его через Runtime.getRuntime().exec or ProcessBuilder, не завершая процесс. Всего 25 файлов конвертируются и замораживаются. Когда я завершаю процесс, я могу видеть все файлы, загружаемые в выходную папку, которые не были загружены в одну и ту же папку.ProcessBuilder или Runtime.getRuntime(). Exec не завершит выполнение jar

Любые предложения?

Мой код

private boolean runLoaderScript() throws IOException, InterruptedException { 
    String args[] = { "java", "-jar", "C:\\Users\\gursahibsahni\\Desktop\\jar\\epnlm_new-1.0.0-jar-with-dependencies_WSJ_stringdate.jar", "-c", "-f", "-d", "7", "C:\\Users\\gursahibsahni\\Desktop\\ConsynInput\\wsjInput\\input" }; 
    ProcessBuilder builder = new ProcessBuilder(args); 
    Process qq = (builder).start(); 
    qq.waitFor(); 
    return true; 
} 

private boolean runValidator() throws IOException, InterruptedException { 
    Process validatorProcess = Runtime.getRuntime().exec("java -jar C:\\Users\\gursahibsahni\\Desktop\\jar\\wsj_jar_20140423.jar -efv -d 7 C:\\Users\\gursahibsahni\\Desktop\\ConsynInput\\wsjInput\\output"); 
    return (validatorProcess.waitFor()) == 0 ? true : false; 
} 

Кроме того, когда я пытаюсь импортировать баночку в моем проекте и вызвать основную функцию для преобразования XML, это не преобразование XML правильно. Смысл, константы подходят очень хорошо, но функции, которые вызываются в файлы классов для получения данных, не вызываются во время импорта.

ДА! Запуск кувшина в командной строке - это успех! Он работает безупречно. Но при импорте он не преобразуется должным образом. Почему такое поведение? Его очень странно. Пожалуйста помоги.

+1

Почему вы используете exec на Java, когда вы можете просто импортировать JAR-файл в путь к классам и делать '{CLASS} .main ({ARGS});' (вы можете использовать отражение для динамического импорта классов)? – nulldev

+0

Да, это действительно сработало. Но почему этот метод не работает. ? –

+0

@nulldev Я обновил вопрос. –

ответ

0

Вы должны использовать StdOut (и, возможно, StdErr) вашего процесса ... иначе процесс будет зависать, когда буфер заполняется!

, если вы не хотите, чтобы закодировать, что сами вы можете взглянуть на Apache CommonsExec ... это помогает при выполнении и обработки внешних процессов https://commons.apache.org/proper/commons-exec/tutorial.html

Среди прочего, он перехватывает вывод подпроцессов с использованием org.apache.commons.exec.ExecuteStreamHandler.

+0

он работает. Можете ли вы рассказать о заполнении буфера? –

+0

Это не имеет никакого отношения к самой Java. Операционная система (в этом отношении нет никакой разницы между Linux, Win, ...) создается буфер размером всего несколько килобайт между родительским и дочерним процессами. если ваш дочерний процесс заполняет этот буфер, записывая его на консоль, а родитель не потребляет данные из буфера, а затем буфер заполняется, а потом следующие дочерние элементы блокируют и «вставляют» дочерний процесс. –

+0

Спасибо за информацию. :) –

Смежные вопросы