2012-12-08 67 views
21

我不是java專家或eclipse專家。 目前我正在進行一個項目,我需要經常調試/測試。我使用eclipse運行按鈕。但是,當我不關閉程序eclipse/java再次打開它(第二個窗口)。 這是一個帶有swing jframe的gui應用程序。停止運行多個實例的Eclipse/Java

eclipse或java中是否有一個函數用於終止以前的版本,並在運行時打開新版本?

+2

有一個紅色的方形圖像的停止按鈕。點擊它停止/終止應用程序。 –

+3

@LuiggiMendoza只會停止當前進程。你需要通過任務管理器來終止Java進程(至少,這是我總是這樣做的)。但坦率地說,只需在窗口中添加一個onclose即可:'frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)' – Vulcan

+1

@Vulcan即使我在Eclipse上運行多線程應用程序,它也能工作(它甚至可以阻止/終止Web應用程序服務器)。 –

回答

7

請嘗試以下方法:

  1. 如果你在調試的角度來看,你可以右鍵點擊運行實例,然後單擊「終止並重新啓動」(您可以從窗口綁定快捷這個 - >首選項 - >一般 - >鍵)這對我來說很好。

  2. This link說你可以綁定「終止&重新啓動」在任何預期。你可以嘗試一下,但是對我來說也一樣。

  3. 使用此插件https://bitbucket.org/mantis78/relaunch-plugin(未嘗試)。

+0

1)工作,但不幸的是我不能設置相同的調試密鑰終止和重新啓動,只需要記住點擊右鍵:(赫赫,如果我們可以算法宏eclipse命令它可以工作,我認爲 –

3

在eclipse中,當您運行/調試應用程序時,會創建一個新實例。 有兩個選項:

  1. 當你運行一個應用程序就打開了UI /結果在控制檯中。因此,您必須通過單擊其中一個來停止現有應用程序:Console view

  2. 在調試模式下,您必須執行相同操作。 Debug view

否則你必須在代碼中處理這個。檢查此線程:How to restrict Eclipse-RCP application to a single instance?

希望這是有幫助的。啓動時,按ctrl-F2

2

我想補充另一個,最快的(對我來說)的解決方案。

該快捷方式終止當前正在運行/調試的應用程序。

1

我覺得問題不在eclipse中,而在於你實現應用程序的方式。詳情請參閱以下網址。如果您的應用程序在eclipse外部運行,上述解決方案雖然有效,但會產生問題。隨着用戶每次啓動和關閉應用程序,都會啓動一個新的jvm實例。

Exit on close button

-2

只需按下停止按鈕。或通過退出按鈕關閉會話

1

真的很晚在這一個,但嘿,遲到比從未。初始化所有內容時使用start()。如果您使用的是JFrame,請使用start(Jframe框架),以便在程序手動關閉時自動處理。如果不是,請在程序手動退出時調用CloseClose(),否則它將不會在下一次啓動。

package your.package; 

import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.File; 
import java.io.IOException; 

import javax.swing.JFrame; 

public class ReLaunch { 
    private static boolean relaunchClose = false; 
    private static File runCheck = new File("run.check"); 
    private static File deleteCheck = new File("delete.check"); 

    /** 
    * Use ReLaunch to stop multiple instances 
    */ 
    public static void start() { 
     //Check to see if application is already running 
     if(runCheck.exists()) { 
      //Mark a request to exit the existing application 
      try { deleteCheck.createNewFile(); } catch (IOException e) { e.printStackTrace(); } 
      //Wait until the existing application terminates itself 
      while(runCheck.exists()); 
      //Remove the delete request so current application doesn't terminate 
      if(deleteCheck.exists()) deleteCheck.delete(); 
     } 

     //Mark that this application is currently running 
     try { runCheck.createNewFile(); } catch (IOException e) { e.printStackTrace(); } 

     //Creates a new thread that checks if a new application is requesting to run 
     new Thread(new Runnable() { 
      public void run() { 
       //Wait until delete request shows up 
       while(!deleteCheck.exists()); 
       //Proof that the application is closed to be re-launched 
       relaunchClose = true; 
       //Unmarks this application as running 
       if(runCheck.exists()) runCheck.delete(); 
       //Terminated so new application can run 
       System.exit(0); 
      } 
     }).start(); 
    } 

    /** 
    * Same as start, but automatically handles when the frame is closed by the user by marking that no applications are running 
    * @param frame JFrame which needs to be closed 
    */ 
    public static void start(JFrame frame) { 
     start(); 
     //Listen for when the window is manually closed 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent event) { 
       onClose(); 
      } 
     }); 
    } 

    /** 
    * Marks this application as not running if it is exited manually 
    */ 
    public static void onClose() { 
     if(!relaunchClose) runCheck.delete(); 
    } 
} 
+0

我實際上更喜歡你的方法爲我的usecases,我已經創建了一個同樣的邏輯,但使用gist [Highlander](https://gist.github.com/hrgdavor/d81a231c274e225447117902a633bdb9),但使用TCP端口(它只增加了10-15毫秒的延遲)我喜歡這個,因爲我只是按F11或CTRL + F11來運行最新的應用程序,我已經習慣了這麼多的run-jetty p lugin –

2

在Eclipse霓虹燈去Window -> Preferences -> Run/Debug -> Launching並在Launch Operation部分檢查:

[X] Terminate and Relaunch while launching

Terminate and Relaunch while launching