Метод запуска из запущенного jar-файла, который был загружен через Runtimeexec(..) в java-файле

это то, что я хочу сделать:

Мне нужно запустить два файла jar из файла java, и я хочу вызвать метод из первого запущенного файла jar, когда я прочитаю определенный статус из второго файла jar. Я понял, как читать выходной поток из этих файлов jar. (Я также знаю, что распечатывается не файл jar, а классы внутри файла jar. Я просто сформулировал вопрос таким образом, чтобы четко объяснить, что я использую файл java, в котором я запускаю два файла jar)

long l = System.currentTimeMillis();
Process theProcess1 = Runtime.getRuntime().exec("java -jar \"C:/test.jar\"");

inStream = new BufferedReader(new InputStreamReader( theProcess1.getInputStream() ));  
...

Теперь я могу прочитать вывод файла jar.

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

e.g.:

if(theProcess2 output a certain statuscode)
{
   start a certain Method from executed jar file "in" theProcess1

}

Я думаю, что это возможно, используя вывод theProcess1, но я не знаю, как прочитать этот поток в файле jar. (Файл jar не знает, что он был запущен через файл java.

Есть идеи?


person gemorra    schedule 03.04.2013    source источник


Ответы (1)


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

Как только ваша банка загружена, вы можете использовать Class.forName для доступа ко второму нужному классу jar.

РЕДАКТИРОВАТЬ: Вот небольшой фрагмент, который поможет вам прочитать стандартный вывод процесса.

//open a buffered reader on process std output
    InputStreamReader ir = new InputStreamReader(theProcess1.getInputStream());
    BufferedReader in = new BufferedReader(ir);

   //read it line per line
    String line;
    while ((line = in.readLine()) != null) {

       System.out.println(line);

    }
person user18428    schedule 03.04.2013
comment
Эй, спасибо. Мне нужно запустить обе банки на отдельных виртуальных машинах. Я думаю, что должна быть возможность использовать выходной поток класса Process? Но как я могу использовать это как входной поток в моем файле jar? - person gemorra; 03.04.2013
comment
Это жесткое ограничение, но вы можете попробовать метод ответа, приведенный здесь stackoverflow.com/questions/1781091/ для загрузки класса из байтов. Я думаю, вам следует переосмыслить свой дизайн, используя, например, RMI (или любую другую стратегию удаленного вызова методов). - person user18428; 03.04.2013
comment
Извините, я только что понял, что меня, возможно, смутила формулировка вашего вопроса. Вы хотите, чтобы программа Java реагировала на консольный вывод другой программы Java? - person user18428; 03.04.2013
comment
Я реализовал java-программу, которая реагирует на выходные данные из заданного запущенного файла jar (через Runtime...exec(..)) и поток ввода процесса. Я хочу написать что-то из класса java в запущенный файл jar, и я хочу, чтобы этот файл jar реагировал на это. Поэтому я думаю, что мне нужна именно такая коммуникация процесса. Я просто подумал, что когда у класса Process есть входной поток, из которого я могу прочитать system.out.println() из запущенной банки, выходной поток из класса Process предназначен для наоборот (отправка sth в банку файл)... - person gemorra; 04.04.2013
comment
Или просто: С помощью следующего кода: Process theProcess1 = Runtime.getRuntime().exec(java -jar \C:/test.jar\); theProcess1.getOutputStream(); ‹=== Для чего я могу использовать OutputStream и как? - person gemorra; 04.04.2013
comment
Хорошо, я понял :) Я отредактировал свой ответ, добавив немного кода, чтобы помочь вам прочитать вывод процесса 1. - person user18428; 04.04.2013
comment
спасибо. но это не мой вопрос. ;) Опять же: я (а также вы) использовали inputStream для процесса (getInputStream()). Я также попробовал это и понял, что распечатать то, что другой процесс распечатал через этот поток. Что я могу сделать с OutputStream? Что такое: theProcess1.getOutputStream()? - person gemorra; 04.04.2013
comment
Это стандартный ввод процесса. Запись в этот поток аналогична вводу данных в консоль программы. - person user18428; 04.04.2013