如何从另一个程序中以编程方式关闭在windows中运行的特定java应用程序?

如何从另一个程序中以编程方式关闭在windows中运行的特定java应用程序?,java,windows,Java,Windows,我需要(强制)从另一个程序中关闭一个特定的java应用程序。对于任何本机程序来说,杀死它的进程或将vm_发送到它的主窗口附近通常是有效的,但对于运行在windows上的java应用程序来说就不那么有效了。请注意,java应用程序仅显示托盘图标,在正常状态下没有打开的窗口。如果您知道java程序的PID,请使用以下命令: Runtime.getRuntime().exec("taskkill /F /PID bla"); 其中bla是程序的PID 这个/F参数将强制杀死一个应用程序,我看不出为什

我需要(强制)从另一个程序中关闭一个特定的java应用程序。对于任何本机程序来说,杀死它的进程或将vm_发送到它的主窗口附近通常是有效的,但对于运行在windows上的java应用程序来说就不那么有效了。请注意,java应用程序仅显示托盘图标,在正常状态下没有打开的窗口。

如果您知道java程序的PID,请使用以下命令:

Runtime.getRuntime().exec("taskkill /F /PID bla");
其中
bla
是程序的PID

这个
/F
参数将强制杀死一个应用程序,我看不出为什么Java程序会与其他程序有任何不同,并且能够生存下来

请注意,此代码显然是特定于Windows的。如果您希望它是可移植的,您应该首先使用

System.getProperty("os.name")
然后,如果您在Windows上,请使用
taskkill/F
,如果您在*nix系统上,请使用
kill-9
,如果您在更奇特的平台上,请使用其他方法

更新:为了更好地了解所有正在运行的进程,我建议。如果需要命令行进程列表器,请使用

如果您想杀死一个特定的Java程序,这可能会有问题,因为默认情况下每个Java进程都被命名为
Java.exe
javaw.exe


使用PsList,您可以通过编程扫描所有以
java
开始的进程,然后结合
jps
,您将获得更多关于您真正想要杀死什么的信息。

一个简单的破解方法是复制/粘贴第二个版本的java.exe(或javaw.exe),将其命名为java_alt.exe,然后使用Unix Tools for windows以新名称终止该进程

如果将java应用程序的进程ID写入到已知位置的临时文件中会发生什么。当程序启动时,执行以下操作:


//mark the instance file for delete
String instanceFileLocation = System.getProperty("java.io.tmpdir") + File.separator + "instances.dat";
File PIDFile = new File(instanceFileLocation).deleteOnExit();
//write the process id here
然后,任何程序或应用程序都可以找到临时文件和特定进程id。使用发布的其他解决方案杀死它


然后使用

它不是我的应用程序,因此我不确定是否可以从中获取PID,而且它是否真的有PID,因为javaw.exe是程序运行时唯一运行的进程。在多个java程序中可能有多个javaw.exe,但我还没有找到它。关于如何获取PID有什么建议吗?如果您运行jps-lvm,您可以获得java程序的完整命令行。你需要知道一些关于你想要杀死的进程的事情。很棒,jps工具正是我所需要的,现在我有了PID,应该是小菜一碟了@克里斯蒂安:我已经为你添加了更多的方法,可以帮助你找到真正的PID。我刚刚意识到JPS需要在计算机上安装JDK来完成这项工作,而客户端计算机通常不是这样,还有其他方法吗?我需要杀死的java应用程序不是我的,我正在从另一个程序中杀死它,如果您有“权限”终止该进程并能够识别它,那么这仍然有效吗。有可能让该进程使用一个交替命名的java可执行文件吗?它不是我自己的应用程序,所以这不是一个选项