【问题标题】:Running only single instance of Executable Jar file仅运行 Executable Jar 文件的单个实例
【发布时间】:2012-02-15 18:02:26
【问题描述】:

所以我将我的项目打包为一个可以正常工作的可执行 jar。但有时会发生用户多次启动文件,这会导致它启动同一项目的多个实例(导致意外行为,例如通过延迟的项目实例覆盖文件中的值)。

我想知道对于windows平台(Win7),有哪些选项可以只锁定一次执行,然后如果jar已经在运行,就不要再继续执行代码了。

我阅读了有关进程 ID 的信息,但如果有多个 java 应用程序,它们最终都会将图像名显示为 javaw.exe,我如何确定自己的进程 ID?

请建议做这件事的正确方法是什么,谢谢!!

【问题讨论】:

    标签: java executable-jar pid


    【解决方案1】:

    最简单的解决方案是使用固定的、未使用的端口。

    ServerSocket ss;
    try {
        ss = new ServerSocket(MY_PORT);
        // not already running.
    } catch (BindException e) {
        // already running.
    }
    

    【讨论】:

    • 非常感谢,这是迄今为止任何平台的最佳解决方案 :)
    【解决方案2】:

    根据我的经验,我使用的最佳方法是在特定端口(如 61234)上创建一个侦听 ServerSocket。套接字不做任何事情,但是如果您设法创建它,则意味着没有其他进程已启动。可执行 jar 文件的重复实例将无法在同一端口上创建 ServerSocket,因此它们应该退出。

    【讨论】:

      【解决方案3】:

      您可以在应用程序启动时在专用 TCP 端口上打开一个 ServerSocket,并在应用程序关闭时将其关闭。

      如果实例已在运行,您将收到“正在使用的端口”异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-22
        • 1970-01-01
        • 2017-12-02
        • 1970-01-01
        • 2019-11-17
        • 2018-06-04
        • 2021-07-17
        • 1970-01-01
        相关资源
        最近更新 更多