仅当尚未运行时才启动 Java 程序

2022-09-03 00:57:29

我需要在我的 Java 应用程序中启动 1-3 个具有用户定义的路径的外部程序。我有几个要求:

  1. 如果程序已经在运行,我不希望程序执行

  2. 我不希望任何程序从我的Java应用程序中窃取焦点

  3. 我不在乎他们中的任何一个是否无法启动。他们只需要默默地失败。

以下是我到目前为止想出的:

ProcessBuilder pb = new ProcessBuilder(userDefinedPath1);
try {
    pb.start();
}
catch (Exception e) {
    // Something went wrong, just ignore
}

然后我用另外两条路径重复了3次。这开始就像我预期的那样,并满足了我的第三个要求,但前两个要求失败了。

最好的方法是什么?

编辑:

  1. 我无法控制这些其他应用程序。他们是第三方。此外,用户可能随时手动启动或停止它们。

  2. 我知道可执行文件的确切名称(例如“blah.exe”),它们将始终相同,但可执行文件的路径不一定是相同的。

  3. 批处理文件包装器在这里是不可行的。

  4. 其他应用程序不是Java应用程序,只是普通的旧Windows可执行文件。


答案 1

为了避免潜在的锁定文件/崩溃问题,可以启动服务器并捕获端口冲突。这些服务器在系统关闭时自动停止(即使在崩溃后)

public static ServerSocket ss;

public static void main (String[] args) {

    ss = null;

    try {
        ss = new ServerSocket(1044);
    } catch (IOException e) {
        System.err.println("Application already running!");
        System.exit(-1);
    }
}

答案 2

我猜你无法控制其他两个应用程序...如果你这样做了,这不会太糟糕 - 你可以让他们听一个套接字,看看你上来时套接字是否可用。

下一个解决方案实际上可能是独立于语言的。您可以通过批处理文件包装器管理整个系统。编写一个批处理文件,该文件在启动时创建文件,并在文件停止时将其删除。Unix系统经常使用这种技术 - 它们经常将文件称为锁定文件。

如果只有你的应用程序会启动这些其他应用程序,那么你可以简单地跟踪你是否已经启动了它,所以我猜这是不可能的,或者你不会问,所以我假设用户可能已经通过其他机制启动了这些程序。

如果您无法控制其他应用程序的启动,甚至无法编写批处理文件来启动它们,那么您就无法执行所需的操作(请注意,即使用户手动启动它们,应用程序也必须始终使用批处理文件)。

我只是最后的一个努力可能是获取进程状态并解析它,但是您必须确切地知道PS中其他应用程序的名称,这并不是微不足道的。此外,所有java应用程序在大多数进程状态打印输出中都倾向于具有相同的确切签名,这可能使其无用。

问题是,如果其中一个程序是在你的应用程序之外启动的,你几乎没有办法识别这个事实,除非你碰巧知道它是确切的进程状态签名,即使这样它也是不可靠的。


推荐