【问题标题】:Stop Eclipse/Java running multiple instances停止运行多个实例的 Eclipse/Java
【发布时间】:2012-11-26 13:34:55
【问题描述】:

我不是 java 专家或 eclipse 专家。 目前我正在做一个项目,我需要经常调试/测试。我使用 Eclipse 运行按钮。但是当我不关闭程序时,eclipse/java 会再次打开它(第二个窗口)。 这是一个带有 swing jframe 的 gui 应用程序。

eclipse或java中是否有一个函数可以终止之前的构建并在运行时打开新的构建?

【问题讨论】:

  • 有一个带有红色方形图像的停止按钮。单击它以停止/终止应用程序。
  • @LuiggiMendoza 这只会停止当前进程。您需要通过任务管理器终止 java 进程(至少,这是我一直这样做的方式)。但坦率地说,只需在窗口中添加一个 onclose:frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
  • @Vulcan 即使是我在 Eclipse 上运行的多线程应用程序,它也对我有用(它甚至可以停止/终止 Web 应用程序服务器)。
  • @LuiggiMendoza 这不是关于多线程应用程序,而是关于同时运行多个应用程序。
  • 我知道停止按钮及其 exit_on_close。但我想在 Eclipse 中按运行时自动执行此操作(如果可能的话)

标签: java eclipse swing jframe


【解决方案1】:

在 Eclipse Neon 中转到 Window -> Preferences -> Run/Debug -> Launching 并在 Launch Operation 部分检查:

[X] Terminate and Relaunch while launching

【讨论】:

    【解决方案2】:

    尝试以下方法:

    1. 如果您处于调试视角,您可以右键单击正在运行的实例并单击“终止并重新启动”(您可以从窗口 -> 首选项 -> 常规 -> 键为此绑定快捷方式)这解决了对我来说很好。

    2. This link 表示您可以在任何方面绑定“终止并重新启动”。你可以试一试,但对我来说同样没有效果。

    3. 使用这个插件https://bitbucket.org/mantis78/relaunch-plugin(没试过)。

    【讨论】:

    • 1) 有效,但不幸的是我不能设置相同的调试键来终止和重新启动,只需要记住点击右键:( 呵呵,如果我们可以算法宏 eclipse 命令它可以工作我认为
    【解决方案3】:

    在 Eclipse 中,当您运行/调试应用程序时,会创建一个新实例。 有两种选择:

    1. 当您运行应用程序时,它会在控制台中打开 UI/结果。因此,您必须通过单击以下之一来停止现有应用程序:

    2. 在调试模式下,您必须这样做。

    否则你必须在代码中处理这个问题。检查此线程:How to restrict Eclipse-RCP application to a single instance?

    希望这有帮助。

    【讨论】:

      【解决方案4】:

      只是添加另一个最快的(对我来说)解决方案:

      启动前,请按ctrl-F2

      此快捷方式终止当前正在运行/调试的应用程序。

      【讨论】:

        【解决方案5】:

        我觉得问题不在于 Eclipse,而在于您实现应用程序的方式。详情请参考以下网址。如果您的应用程序在 Eclipse 之外运行,上述解决方案虽然有效,但会出现问题。每次用户启动和关闭您的应用时,都会启动一个新的 jvm 实例。

        Exit on close button

        【讨论】:

          【解决方案6】:

          这件事真的迟到了,但是嘿,迟到总比没有好。初始化所有内容时使用 start()。如果您使用的是 JFrame,请使用 start(Jframe frame) 以便在手动关闭程序时自动处理。如果不是,请在程序手动退出时调用 onClose(),否则下次不会启动。

          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();
              }
          }
          

          【讨论】:

          • 我实际上更喜欢你的用例方法,我创建了一个具有相同逻辑但使用 TCP 端口的要点Highlander(它只为应用程序增加了 10-15 毫秒的延迟)。我喜欢这个,因为我只需按 F11 或 CTRL+F11 即可运行最新的应用程序。我已经习惯了 run-jetty 插件
          【解决方案7】:

          只需按下停止按钮。或通过退出按钮关闭会话

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-04-22
            • 2013-03-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-07
            相关资源
            最近更新 更多