Передать строку в качестве параметров из одного Java-приложения в другое

Я пытаюсь передать строку в качестве параметра из одного Java-приложения во второе в качестве параметра запуска.

например, у меня есть приложения, которые должны вызывать запуск другого Java-приложения (просто содержит только JOptionPane, JDialog или простой JFrame) перед System.exit(0);, там я пытаюсь отправить некоторые описания из закрывающего приложения в другое,

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

    import java.io.IOException;
    import java.util.concurrent.*;

    public class TestScheduler {

        public static void main(String[] args) throws InterruptedException {
            ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
            executor.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
            executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(true);
            for (int i = 0; i < 10; i++) {
                final int j = i;
                System.out.println("assign : " + i);
                ScheduledFuture<?> future = executor.schedule(new Runnable() {

                    @Override
                    public void run() {
                        System.out.println("run : " + j);
                    }
                }, 2, TimeUnit.SECONDS);
            }
            System.out.println("executor.shutdown() ....");
            executor.shutdown();
            executor.awaitTermination(10, TimeUnit.SECONDS);
            try {
                Process p = Runtime.getRuntime().exec("cmd /c start java -jar C:\\Dialog.jar 'Passed info'");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            System.out.println("System.exit(0) .....");
            System.exit(0);
        }

        private TestScheduler() {
        }
    }

//
import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;

public class Main {

    private static ArrayList<String> list = new ArrayList<String>();

    public Main() {
        JFrame frm = new JFrame();
        JTextArea text = new JTextArea();
        if (list.size() > 0) {
            for (int i = 0; i < list.size(); ++i) {
                text.append(list.get(i));
            }
        }
        JScrollPane scroll = new JScrollPane(text,
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.add(scroll, BorderLayout.CENTER);
        frm.setLocation(150, 100);
        frm.setSize(new Dimension(400, 300));
        frm.setVisible(true);
    }

    public static void main(String[] args) {
        if (args.length > 0) {
            for (String s : args) {
                list.add(s);
                System.out.print(s + " ");
            }
        }
        Main m = new Main();
    }
} 

мой вопрос :

EDIT1: если существует другой способ передачи некоторого значения из одного Java-приложения (должно быть вызвано System.exit(0);) в другое Java-приложение, другой способ, как я пытался, используя Process/ProcessBuilder

EDIT2: мой перекрестный пост http://forums.oracle.com/forums/thread.jspa?threadID=2229798&tstart=0

принятый ответ от OTN


person mKorbel    schedule 25.05.2011    source источник


Ответы (2)


принятый ответ jverd на OTN

Да, есть другие способы. Этот способ не соответствует вашим потребностям?

  1. Есть еще одна сигнатура exec(), которая принимает массив, где первый элемент — это команда, а остальные элементы — ее аргументы. Это может быть или не быть вызовом varargs. Это будет выглядеть примерно так, хотя может работать не так, как у меня.

    exec("cmd", "/c", "start", "java", "-jar", "C:\Dialog.jar", "Переданная информация");

// OR

exec(new String[] {"cmd", "/c", "start", "java", "-jar", "C:\\Dialog.jar", "Passed info"});
  1. Вы можете поместить информацию в файл, который читает второй процесс.

  2. Вы можете хранить информацию в базе данных, которую запрашивает второй процесс.

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

  4. Вы можете использовать инструмент обмена сообщениями более высокого уровня, такой как JMS, Active MQ и т. д.

  5. Вы можете использовать RMI.

  6. Вы можете использовать CORBA.

Я уверен, что есть и другие подходы.

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

person mKorbel    schedule 28.05.2011

Чувак,

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

Это хорошая статья. Я предполагаю, что у вас "проблема с вашим параметром" ;-)

Ваше здоровье. Кейт.

person corlettk    schedule 25.05.2011
comment
Я думаю, что у меня не будет проблем с Proces или ProcessBuilder, этот пример правильно передает «Переданную информацию», я отредактирую свою тему - person mKorbel; 25.05.2011