2013-06-12 3 views
2

많은 소프트웨어에서 변경 한 후에는 소프트웨어를 다시 시작해야 변경 사항이 적용되고 때로는 자동으로 소프트웨어를 다시 시작하는 옵션이 있습니다 . 어떻게 이것을 Java로 구현할 수 있습니까?
이 내가 시도 것입니다 :
Java에서 '응용 프로그램 다시 시작'기능을 구현하는 방법

int o = JOptionPane.showConfirmDialog(
           frame, 
           "<html>The previously selected preferences have been changed.<br>Watch must restart for the changes to take effect.<br> Restart now?</html>", 
           "Restart now?", JOptionPane.YES_NO_OPTION); 
       if(o == JOptionPane.YES_OPTION) { 

        try { 
         Process p = new ProcessBuilder("java", "Watch").start(); 
        } catch(IOException e) { 
         e.printStackTrace(); 
        } 
        frame.dispose(); 

그러나,이 작동하지 않습니다. 응용 프로그램이 종료됩니다. 내가 여기서 무엇을 놓치고 있니? 미리 감사드립니다!

+0

대신 그냥 "시계"의 절대 경로를보십시오. – Sebastian

+0

CLASSPATH를 추가 하시겠습니까? –

+0

커맨드 라인에서 프로그램 시작을 시도하십시오 -> 정확히 이것을 'ProcessBuilder'에 넣으십시오. "PATH"와 같은 환경 변수가 ProcessBuilder로로드되지 않아서 "java"가 인식되지 않는 문제가있었습니다. 그러나 이것을 할 수있는 방법이 있습니다. 나는 기억이 안 난다 ... – Sebastian

답변

0

이 흥미로운 같습니다 Make your application restart on its own

는 기본적으로, 당신은 당신의 응용 프로그램을 실행하는 스크립트를 만들 수 있습니다. 앱에서 사용자가 다시 시작하도록 선택하면 다시 시작 파일이 만들어지고 앱이 종료됩니다. 종료시 시작 스크립트는 다시 시작 파일이 있는지 확인합니다. 앱이있는 경우 앱을 다시 호출합니다.

0

JVM의 기능 만 사용하는 것은 어렵다고 생각합니다.

나는이 해본 적이 없다,하지만 당신이 정말로 당신의 현재 응용 프로그램이 실행되는 전체 JVM을 종료하고 그것의 완전히 새로운 인스턴스를 시작하려면, 나는 아마이 라인을 따라 뭔가 시도 할 것이다 :

    을 주 응용 프로그램 스레드에서
  1. 는, 예를 들어, Runtime.getRuntime를 사용하여 (쉘 스크립트/배치 파일을 시작() 다음 단계를 수행 간부 ("...")`:.

    • 포크 또는 일부를 사용을 백그라운드에서 다음 단계를 시작하는 다른 시스템 시설
    • 잠시 기다려 이전 인스턴스가 종료되었음을 확신 할 수 있습니다. 또는 이전 인스턴스가 사라 졌음을 알려주는 PID 파일이나 비슷한 것을 제거 할 때까지 기다리십시오.
    • 응용 프로그램 기본 클래스로 새로운 JVM을 시작하십시오. 아마도 명령 줄 인수를 제공하거나 실제로이 인스턴스에 자동으로 다시 시작된 인스턴스를 알리기 위해 일부 시스템 속성을 설정해야합니다 (예 : 계속해서 어디에서 원래 중단). 어쩌면, 첫 번째 주요 응용 프로그램 인스턴스에 1 단계 시간의 작은 금액을 기다리는 병행
  2. (배경 물건이 실제로 실행되고 있는지 확인하기 위해) 및 System.exit(0); 또는 종료의 다른 메서드를 호출합니다.

어쩌면 더 간단한 방법이 있습니다. 생각할 수있는 첫 번째 방법 일 수 있습니다. 다음에 대한

0

무엇 :

public static void main(final String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      buildAndShowGui(args); 
     } 
    }); 
} 

public static void buildAndShowGui(final String[] args) { 
    final JFrame frame = new JFrame("Window"); 
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
    frame.setSize(100, 400); 
    frame.setLayout(new FlowLayout()); 
    JButton button = new JButton("Click!"); 
    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      int option = JOptionPane.showConfirmDialog(frame, "Restart?"); 
      if (option == JOptionPane.YES_OPTION) { 
       frame.dispose(); 
       restart(args); 
      } 
     } 
    }); 
    frame.add(button); 
    frame.setVisible(true); 
    frame.toFront(); 
} 

public static void restart(String[] args) { 
    main(args); 
} 
관련 문제