Java запустить другую программу

Запуск стороннего приложения?

Необходимо из Java программы запустить стороннее приложение БЕЗ ожидания закрытия запущенного приложения.

запустили jar’ник — открылся блокнот (windows среда) и завершилась работа jarника

Оценить 1 комментарий

А в чём, собственно, проблема? Процесс запущенный ProcessBuilder -ом завершается по выходе из запускающего приложения? Или вы не знаете каким вызовом WinAPI воспользоваться?

Разбирайтесь со своей программой. Зачем она чего-то ждёт? Она вызывает Process.waitFor() ? Потому что иначе вызывающая программа не ожидает завершения вызванной. Вот код для примера:

import java.io.IOException; public class Run < public static void main(String[] args) < try < new ProcessBuilder("/usr/bin/kwrite").start(); >catch (IOException e) < e.printStackTrace(); >> > 

Запускает программу и завершает работу (в Linux). Подставьте запуск notepad и проверьте. Неужели Java-программа не завершит работу?

public static void main(String[] args) <
try <
new ProcessBuilder(«notepad»).start();
> catch (IOException e) <
e.printStackTrace();
>
>

Блокнот открылся, программа висит запущенной пока не закрою блокнот — вопрос остается открытым.
Как открыть блокнот и не закрывая его завершить Java приложение

Виндопроблемы. Посмотрите, может это поможет. В общем, вам нужно найти аналог nohup для windows. Может start /p notepad вместо notepad поможет?

Источник

Русские Блоги

При запуске внешней программы на Java используется метод exec () класса java.lang.Runtime. Этот метод возвращает класс Process.
Если вы хотите захватить вывод работающей программы, используйте класс Process. Класс Process имеет три метода:
Process.getOutputStream(), Process.getInputStream(), Process.getErrorStream().
Соответствует стандарту stdin, stdout, stderr. Поэтому, если вы хотите захватить вывод программы, вы должны использовать
Process.getInputStream()。

Пример, который я привел ниже, состоит в том, чтобы запустить программу ping и затем вывести ее вывод на экран.
Эффект такой же, как прямой запуск программы ping.
Для примеров использования других методов класса Process, пожалуйста, скачайте примеры API библиотеки классов jdk1.1, которые я предоставил.

 import java.io.*; 
class Main <
public static void main(String[] args) <
try <
String cmd = "ping ";
String param ="202.112.58.200";
Process child = Runtime.getRuntime().exec(cmd+param);
// получить вывод ping
InputStream child_in = child.getInputStream();
int c;
while ((c = child_in.read()) != -1) <
// System.out.println("kkk");
System.out.print((char)c);
>
child_in.close();
> catch (IOException e) <
System.err.println(e);
>
>
>

Два других простых примера: вызов браузера ie с помощью java (iexplore.exe и файл класса находятся в одном каталоге)


import java.io.*;
class Main <
public static void main(String[] args) <
try <
String cmd = "iexplore.exe ";
String param ="http://www.java3z.com/";
Process child = Runtime.getRuntime().exec(cmd+param);
// получить вывод ping

> catch (IOException e) <
System.err.println(e);
>
>
>
import java.io.*;
public class ProcessTest public static void main(String args[]) throws IOException Process p = new ProcessBuilder("iexplore.exe","http://www.java3z.com/").start();
>
>

Источник

>рабочие заметки

Недавно в DataGuard пришлось разбираться с запуском внешних программ из java. Некоторые вещи оказались довольно нетривиальны, так что я решил поделиться.

На первый взгляд, все достаточно просто — для простых случаев есть Runtime.exec() , если нужно настроить параметры среды для запуска — есть ProcessBuilder . В любом случае получаем объект Process, у которого вызываем Process.waitFor() , чтобы дождаться завершения — и, вроде бы, все?

К сожалению, ничего подобного. Несмотря на то, что API выглядит просто и очевидно, корректное его использование совсем не просто, и не очевидно. Какие конкретно подводные камни нас ждут?

Главный из них — потоки ввода-вывода (IO streams). У порождаемого процесса нет терминала, к которому он привязан, его stdin, stdout, stderr выдаются порождающему процессу — то есть, нам. Причем обрабатывать их — наша обязанность. Потоки, созданные ОС имеют ограниченный размер буфера. Если, к примеру, буфер stdout для запущенного процесса заполнен, со стороны java никто его не читает (==не освобождает) а процесс настойчиво хочет что-то вывести — то процесс просто окажется заблокирован на IO, и будет ждать, пока stdout кто-нибудь освободит. Если мы не предусмотрели в java код, читающий process.getInputStream() — получается стандартный дедлок: мы ждем завершения процесса, процесс ждет нас.

Самый опасный момент здесь в том, что размер буфера заранее не определен. Поэтому приложение может в одном случае работать как часы, а в другом — непонятно зависать.

Конкретный пример: в обычном, штатном режиме работы внешний процесс выдает одну-единственную строчку «Ок» и завершается. Строчка вполне влезает в буфер, поэтому код

final Process p = Runtime.getRuntime().exec( "my-script.bat" ); final int retCode = p.waitFor();

работает корректно. Но наступает день Х, когда звезды складываются неудачно. И процесс завершается с ошибкой. И, как и положено уважающей себя программе, старается эту ошибку максимально подробно описать. И пытается вывести в stdout простыню текста, превышающую размер буфера. Вуаля — процесс ждет на выводе, java-программа — на process.waitFor()

На мой взгляд — это пример плохо спроектированного API. Простая вещь — запустить внешний процесс не заморачиваясь с его выводом — делается весьма нетривиально. Более того, из самого API это никак не следует. Да, в документации к Process это прописано, но я считаю, что хороший API это такой, использование которого, по крайней мере для простых задач, очевидно без документации. Можно было бы дополнить контракт, например, так: «если клиент не запросил process.getInputStream() / process.getErrorStream() до вызова process.waitFor() — stdout/stderr внешнего процесса автоматически перенаправляются вникуда».

Но наши друзья из Sun этого не сделали, так что приходится отдуваться самим: ProcessRunner

Что делает: берет сконфигурированный ProcessBuilder, создает внешний процесс, запускает асинхронно «помпы», прокачивающие его потоки ввода-вывода либо в пустоту (если пользователь ничего не задал) либо из/в заранее заданные потоки. Метод ProcessRunner.execute() блокируется пока либо процесс не завершится, либо пока не будет вызван ProcessRunner.interrupt() . Пример использования:

final ProcessBuilder pb = new ProcessBuilder("my-script.bat"); final ExecutorService pool = Executors.newFixedThreadPool(3); // нужно минимум 3 свободных потока в пуле final ProcessRunner pwd = new ProcessRunner( "run", pb, pool ); pwd.execute(); final int retCode = pwd.getReturnCode(); . pool.shutdown();

В этом примере ввод-вывод my-script.bat будет просто выброшен. Другой пример:

final ProcessBuilder pb = . ; final ProcessRunner pwd = new ProcessRunner( "run", pb, POOL ); final ByteArrayOutputStream out = new ByteArrayOutputStream(); final ByteArrayOutputStream err = new ByteArrayOutputStream(); pwd.setOutputStream( out ); pwd.setErrorStream( err ); pwd.execute(); assertEquals( 0, pwd.getReturnCode() ); final byte[] output = out.toByteArray(); final byte[] errors = err.toByteArray();

Здесь stdout/stderr будут считаны в предоставленные нами потоки. Обратите внимание, что если флаг ProcessBuilder.redirectErrorStream() выставлен в true, то stderr будет слит с stdout, и errors будет пуст.

Больше примеров использования можно посмотреть в тестах ProcessRunnerTest

Источник

Как запустить стороннее java-приложение из главного java-приложения?

Вопрос немножко ламерский, заранее прошу прощения.
Есть необходимость создать оконное java-приложение, которое должно по кнопке запускать стороннее java-приложение в отдельном потоке. То есть, стороннее java-приложение — это скомпилированное в .java или в .jar приложение, классы которого не прописаны в основном java-приложении. Другими словами, я не могу обычным образом объявить класс стороннего java-приложения в основном, чтобы получить доступ к его методу main().
Но ведь как-то это можно сделать? Помогите, пожалуйста. Если вопрос описан в доке, ткните меня в неё, пожалуйста.

Импортировать главный класс другого приложения, создать поток и вызвать в нём main импортированного класса.

TosterModerator

Deimos3, для общения с автором ответа используйте комментарии под соответствующим ответом. Форма ответов только для ответов.

Модератор, у меня под комментарием Сергея Горностаева отсутствует кнопка «Ответить», тогда как под вашим комментарием она есть. Как я могу выбрать то, чего нет?

Deimos3, я не оставлял ни одного комментария в этом вопросе. Я написал один ответ, который вы можете комментировать.

Сергей Горностаев, спасибо, Сергей!
Если внешнее приложение — это неизвестная мне заранее программа в нативном коде, то я могу использовать класс Process, которому в виде строки передам то, что мне нужно запустить. Но мне нужно запустить именно java-программу.
Что-то мне подсказывает что запускать стороннее приложение как
runtime.exec(«C:\\Progra~1\\Java\\jdk1.12\\bin\\java.exe -jar C:\\Users\\Я\\Documents\\MyProjects\\MyProgram\\dist\\MyProgram.jar»);
будет не совсем правильно.
Конечно, я могу попробовать импортировать класс из MyProgram.jar, поместив его в каталог, где его увидит компилятор, но какая гарантия что файл MyProgram.jar после этого не будет перекомпилирован и переложен в другой каталог? Есть ли в Java более гибкие механизмы запуска сторонних java-приложений?
Извините что спрашиваю, но после тщательного поиска я ответа так и не нашёл.

Deimos3, не надо класть в каталог, который увидит компилятор. Надо загружать из classpath, который видит виртуальная машина. Это самый гибкий метод запуска java-приложения.

Источник

Запуск внешних приложений в Java

Запуск Java приложений
Доброго времени суток! Возник такой вопрос: А какие способы есть для запуска Java приложений? Вот.

Запуск команд Linux с Java приложений.
Ja xotel b@ uznat. Mogu li ja s java programm@ zapuskat komand@ Linuxa. Naprimer mogu li ja.

Запуск приложений на Java без установленной JVM
Нашел в интернете статью, о том, что можно запускать приложения без установки JRE/JVM. Батник.

Запуск Java приложений без установленной JVM
Есть у кого батник, кто делал?

Эксперт Java

Лучший ответ

Сообщение было отмечено maks00x как решение

Решение

Запуск и выполнение нескольких команд с вводом и выводом в консоль

1 2 3 4 5 6 7 8 9 10 11 12 13
public class MainCmd { public static void main(String[] args) { try { Process p = new ProcessBuilder("cmd /c dir && echo text command ".split(" ")).inheritIO().start(); // создать новый процесс p = new ProcessBuilder("cmd /c ping localhost && pause ".split(" ")).inheritIO().start(); // создать новый процесс // p.waitFor(2000, TimeUnit.MILLISECONDS); ожидание ограниченного времени p.waitFor(); // если нужно ожидать ввода } catch (Exception e) { e.printStackTrace(); } } }

Запуск внешних приложений из формы VB
Добрый день! Возникла проблема, с которой не могу справиться: Нужно в программе запустить подряд.

Запуск внешних приложений с передачей параметров
У меня есть две программы на windows forms, я хочу сделать так, чтобы из программы 1 можно было бы.

Запуск внешних приложений и inet ссылок
Вопрос1 как из кода запустить нешнее приложение например Notepud.exe? Вопрос2 как из кода перейти.

Запуск внешних приложений и выполнение команд
Добрый день! Такая проблема: как запустить в Python программу и подать ей какую-нибудь команду. Я.

Источник

Читайте также:  Database Records
Оцените статью