Java как запустить внешнюю программу

Обновлено: 07.07.2024

Кажется, что я даже не могу получить мой пакетный файл для выполнения. У меня кончились идеи.

это то, что у меня есть в Java:

ранее у меня был файл Python Sconscript, который я хотел запустить, но поскольку это не сработало, я решил, что вызову скрипт через пакетный файл, но этот метод еще не был успешным.

иногда время процесса выполнения потока выше, чем время процесса ожидания потока JVM, это происходит, когда процесс, который вы вызываете, занимает некоторое время для обработки, используйте команду waitFor () следующим образом:

таким образом, JVM остановится до тех пор, пока процесс, который вы вызываете, не будет выполнен, прежде чем он продолжит работу со стеком выполнения потока.

для запуска пакетных файлов с помощью java, если это вы говорите.

это должно помочь.

ProcessBuilder это Java 5/6 способ запуска внешних процессов.

исполняемый файл, используемый для запуска пакетных скриптов cmd.exe использует /c флаг для указания имени пакетного файла для запуска:

теоретически вы также должны иметь возможность запускать Scons таким образом, хотя я не проверял это:

EDIT: Амара, вы говорите, что это не работает. Ошибка, которую вы указали, - это ошибка, которую вы получите при запуске Java из терминала Cygwin в окне Windows; это то, что вы делаете? Проблема в том, что Windows и Cygwin имеют разные пути, поэтому версия Windows Java не найдет исполняемый файл scons на вашем пути Cygwin. Я могу объяснить дальше, если это окажется вашей проблемой.

протестировано с jdk1.5 и jdk1. 6

это работало хорошо для меня, надеюсь, что это помогает другим тоже. чтобы получить это, я боролся больше дней. : (

У меня была та же проблема. Однако иногда CMD не удалось запустить мои файлы. Вот почему я создаю темп.летучая мышь на моем рабочем столе, рядом с этим темпом.bat собирается запустить мой файл, а затем временный файл будет удален.

Я знаю, что это больший код, однако работал для меня в 100%, когда даже во время выполнения.getRuntime().метод exec() не удалось.

Я унаследовал кодовую базу веб-сервисов Java (BEA/Oracle Weblogic) и вам нужно запустить/запустить внешнее фоновое приложение с веб-службы.

Но я испытываю странное поведение при запуске приложений таким образом (т.е. запущенное приложение перестает работать, даже если процесс все еще активен. - Приложение отлично работает при ручном запуске из обычной командной строки).

Есть ли лучший способ запуска внешних процессов?

У меня есть дополнительная информация, которая может помочь пролить свет на проблему.

    Процесс, который мы пытаемся запустить, потребует часов для завершения, поэтому ожидание завершения (с использованием waitfor() ) в веб-сервисе не будет идеальным сценарием.
    Да, процесс, который мы пытаемся начать с webservice, был создан другим членом команды [cue: ваши глаза рулон. сейчас]

У меня был успех, когда я использовал конструктор процессов для запуска bash script, где внешнее приложение запускается как фоновый процесс (с использованием "&" ).

Это явно создает сиротский процесс, но по крайней мере приложение продолжает выполнять.

спросил(а) 2009-03-13T23:28:00+03:00 12 лет, 8 месяцев назад

Проще говоря: если запущенное приложение записывает в SDTOUT/STDIN, и вы не часто их очищаете (см. Process.getErrorStream/Process.getInputStream), тогда процесс будет блокироваться, когда буфер заполнен (это действительно мало, 4 КБ или меньше).

Я рекомендую вам вызывать ProcessBuilder.redirectErrorStream() перед запуском процесса. Затем после этого создайте поток с помощью метода run() по строкам:

ответил(а) 2009-03-18T00:57:00+03:00 12 лет, 8 месяцев назад

От "перестает работать, хотя процесс все еще активен" Я предполагаю, что вы можете ожидать некоторого выхода из приложения, которое вы запустили, и ничего не получаете.

Попробуйте использовать следующее:

waitFor() заставляет текущий поток ждать, если необходимо, до тех пор, пока процесс, представленный этим объектом Process, не будет завершен.

ответил(а) 2009-03-14T23:17:00+03:00 12 лет, 8 месяцев назад

Во-первых, это происходит в Windows или Linux? Кроме того, что такое запущенное приложение, которое должно быть более или менее выполнено? (это script? является ли это бинарным? это ваш бинарный?)

ИЗМЕНИТЬ

ОК, поэтому запустите bash script (используя ProcessBuilder ), который по очереди запускает новую JVM ( java -jar myApp.jar ).

Что происходит, когда вы пытаетесь создать новую JVM напрямую, используя ProcessBuilder ? Вы изначально сказали:

Запуск внешней программы на переднем плане
Здравствуйте. Подскажите. Вот такая заковырка заставила меня озадачиться. Если вкратце, то.

Перехват стандартного вызова запущенной из ява-приложения внешней программы
Как перехватить стандартный вывод запущенной из ява-приложения внешней программы?

Запуск java приложения
подскажите как запустить java приложение с интерфейсом как exe программу , код пишу в нетбин

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

Запуск виндового калькулятора:

Спасибо!
еще вопрос - окно ява-приложения JFrame открывается автоматически в левом верхнем углу экрана. Можно ли изменить эту позицию? Используй метод setLocation(Point location), или setLocationRelativeTo(Component component). Почему то выполняются только GUI приложения, а программы командной строки нет.
То есть Runtime.getRuntime().exec('xmms') - xmms запускается (это аналог winamp - я под юниксом)
а Runtime.getRuntime().exec('normalize song.mp3') - нет.
(это утилита командной строки которая нормализует по громкости мп3 файлы)
Даже запускаю просто терминал (аналог cmd в виндах) - открывается окно терминала, а он же с параметром -x ls (значит открыть и выполнить в нем программу ls) - мелькает окно на экране и тут-же закрывается.
В чем может быть дело?

Для информации - чтобы эти рантайм функции, пардон, методы работали стабильно - они должны вызываться статически - имею в виду, что объект
класса, содержащего код ниже должен быть объявлен static - почему не знаю, но глюки кошмарные.

public Process exec(String cmd, boolean wait) Process p;
try p=Runtime.getRuntime().exec(cmd);
//если все равно глючит хрень ниже надо раскомментировать
//p.getInputStream().close();
//p.getOutputStream().close();
//p.getErrorStream().close();
>
catch(java.io.IOException e) System.out.println('Can'not execute: '+cmd);
return null;
>
if (wait) try p.waitFor();
>
catch(java.lang.InterruptedException e) Thread.currentThread().interrupt();
>
>
return p;
>

Запуск Java приложения, через файл *.bat
Здравствуйте, подскажите какие строки нужно прописать в *.bat файле для запуска Java приложения.

Запуск консольного приложения java в Mac Os по клику
Есть простое консольное приложение. Скомпилировал, скачал jre для WIN, LINUX, MAC OS. Написал.

Запуск программы на Java (ошибка)
Здравствуйте. Понимаю что эта тема изъезженна вдоль и поперек, но я что-то врубиться никак не могу.

Запуск программы на Java при двойном щелчке по файлу, для Windows
Надо создать возможность доступа к программе написаной на Java. Тоесть делаем двойной щелчёк по.

В этом уроке мы рассмотрим, как выполнять команды оболочки, файлы bat и sh на Java. Мы рассмотрим примеры для всех подходов exec() и ProcessBuilder.

Вступление

В этой статье мы рассмотрим, как мы можем использовать классы Runtime и ProcessBuilder для выполнения команд и сценариев оболочки с помощью Java.

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

Этот процесс также созрел для автоматизации. Нет необходимости запускать все вручную. Используя Java, мы можем запускать одну или несколько команд оболочки, выполнять сценарии оболочки, запускать терминал/командную строку, устанавливать рабочие каталоги и управлять переменными среды с помощью основных классов.

Время выполнения.exec()

Класс Runtime в Java-это класс высокого уровня, присутствующий в каждом отдельном приложении Java. Через него само приложение взаимодействует с окружающей средой, в которой оно находится.

Извлекая среду выполнения, связанную с нашим приложением, с помощью метода getRuntime () , мы можем использовать метод exec() для прямого выполнения команд или запуска файлов .bat /|. sh .

Метод exec() предлагает несколько перегруженных вариантов:

Стоит отметить, что эти процессы запускаются извне из интерпретатора и будут зависеть от системы.

Что также стоит отметить, так это разницу между Строковой командой и Строковой командой cmdArray[] . Они достигают одного и того же. Команда | в любом случае разбивается на массив, поэтому использование любого из этих двух должно привести к одинаковым результатам.

Вам решать, хотите ли вы использовать exec("директория/папка") или exec(новая строка[] .

Давайте приведем несколько примеров, чтобы увидеть, чем эти перегруженные методы отличаются друг от друга.

Выполнение команды из строки

Давайте начнем с самого простого подхода из этих трех:

Запуск этого кода приведет к выполнению команды, которую мы предоставили в строковом формате. Однако мы ничего не видим, когда запускаем это.

Чтобы проверить, правильно ли это выполнено, мы захотим получить доступ к объекту process . Давайте воспользуемся BufferedReader , чтобы взглянуть на то, что происходит:

Теперь, когда мы запускаем этот метод после метода exec () , он должен дать что-то вроде:

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

Укажите рабочий каталог

Если вы хотите запустить команду, скажем, из определенной папки, мы бы сделали что-то вроде:

Здесь мы предоставили методу exec() команду , null для новых переменных среды и новый файл () , который установлен в качестве вашего рабочего каталога.

Стоит отметить добавление cmd/c перед такой командой, как dir .

Поскольку я работаю в Windows, это открывает cmd и /c выполняет последующую команду. В данном случае это реж. .

Причина, по которой это не было обязательным для примера ping , но является обязательным для этого примера, хорошо ответил пользователь SO.

Запуск предыдущего фрагмента кода приведет к:

Давайте посмотрим, как мы могли бы предоставить предыдущую команду в нескольких отдельных частях, а не в одной строке:

Запуск этого фрагмента кода также приведет к:

Какой из них вы хотели бы использовать, сводится только к тому, какой из них вы считаете более читабельным.

Использование Переменных Среды

Давайте посмотрим, как мы можем использовать переменные среды:

Мы можем предоставить столько переменных среды, сколько захотим, в строковом массиве. Здесь мы только что напечатали значение var1 , используя echo .

Выполнение этого кода вернет:

Запуск файлов .bat и .sh

Иногда просто гораздо проще выгрузить все в файл и запустить этот файл вместо того, чтобы добавлять все программно.

В зависимости от вашей операционной системы вы будете использовать файлы .bat или|/. sh|/. Давайте создадим его с содержимым:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Тогда давайте воспользуемся тем же подходом, что и раньше:

Это откроет командную строку и запустит файл .bat в заданном нами рабочем каталоге.

Запуск этого кода, несомненно, приведет к:

Теперь, когда все перегруженные exec() подписи устранены, давайте рассмотрим класс ProcessBuilder и то, как мы можем выполнять команды с его помощью.

Конструктор процессов

ProcessBuilder является базовым механизмом, который выполняет команды при использовании метода Runtime.getRuntime().exec() :

JavaDocs для Время выполнения класс

Взглянув на то, как ProcessBuilder принимает наши входные данные из метода exec() и запускает команду, мы также получаем хорошее представление о том, как ее использовать.

Он принимает строку [] cmdarray , и этого достаточно, чтобы запустить его. В качестве альтернативы мы можем предоставить ему дополнительные аргументы, такие как String[] envp и File dir .

Давайте рассмотрим эти варианты.

ProcessBuilder: Выполнение команды из строк

Вместо того, чтобы предоставлять одну строку , такую как cmd/c dir , в этом случае нам придется разбить ее. Например, если бы мы хотели перечислить файлы в C:/Users каталог, как и раньше, мы бы сделали:

Чтобы фактически выполнить Процесс , мы запускаем команду start() и присваиваем возвращаемое значение экземпляру Процесса .

Запуск этого кода приведет к:

Однако этот подход ничем не лучше предыдущего. Что полезно в классе ProcessBuilder , так это то, что он настраивается. Мы можем устанавливать вещи программно, а не только с помощью команд.

ProcessBuilder: Укажите рабочий каталог

Вместо того, чтобы указывать рабочий каталог с помощью команды, давайте установим его программно:

Здесь мы установили рабочий каталог таким же, как и раньше, но мы удалили это определение из самой команды. Выполнение этого кода даст тот же результат, что и в предыдущем примере.

ProcessBuilder: Переменные среды

Используя методы ProcessBuilder , легко получить список переменных среды в виде Карты . Также легко установить переменные среды, чтобы ваша программа могла их использовать.

Давайте получим переменные среды, доступные в настоящее время, а затем добавим некоторые для последующего использования:

Здесь мы упаковали возвращенные переменные среды в Map и запустили forEach() на нем, чтобы распечатать значения на нашей консоли.

Выполнение этого кода приведет к получению списка переменных среды, имеющихся на вашем компьютере:

Теперь давайте добавим переменную среды в этот список и будем использовать ее:

Запуск этого кода приведет к:

Конечно, как только программа завершит работу, эта переменная не останется в списке.

ProcessBuilder: Запуск файлов .bat и .sh

Если вы хотите снова запустить файл, мы просто предоставим экземпляру ProcessBuilder необходимую информацию:

Выполнение этого кода приводит к открытию командной строки и выполнению файла .bat .:

Вывод

В этой статье мы рассмотрели примеры выполнения команд оболочки на Java. Для этого мы использовали классы Runtime и ProcessBuilder .

Используя Java, мы можем запускать одну или несколько команд оболочки, выполнять сценарии оболочки, запускать терминал/командную строку, устанавливать рабочие каталоги и управлять переменными среды с помощью основных классов.

Читайте также: