VirtualMachine.list() 返回空列表



当我调用VirtualMachine.list((时,当我在eclipse和jdk上时,它可以正常工作。但是一旦我更改为 jre,或者我尝试我的应用程序退出 eclipse,此方法似乎每次都会返回一个空列表。我需要能够在任何地方运行我的应用程序,只需一个 JRE。

for(VirtualMachineDescriptor jvm :  VirtualMachine.list()){
System.out.println("jvm: " + jvm.displayName());
}

我需要能够在任何地方运行我的应用程序,只需一个 JRE。

在这种情况下,您不应该使用com.sun.tools.attach.VirtualMachine类,因为VirtualMachine只是JDK的一部分,而不是JRE。

  • Oracle 许可协议不允许在不分发整个 JDK 的情况下分发工具.jar与您的应用程序一起分发工具。
  • 即使您在应用程序中包含tools.jar,您仍然无法在任何 JRE上运行它,因为tools.jar具有特定于平台的部分,并且它依赖于 JRE 中也缺少的本机库 (libattach.so(。

因此,有以下选项:

  1. 在运行应用程序之前需要安装 JDK。
  2. 整个 JDK 与您的应用程序捆绑在一起。
  3. 从头开始实现缺少的功能。如果您正在寻找如何在不使用tools.jar的情况下列出正在运行的 JVM,这个答案可能会给您一个想法。

我有些困惑。在我看来,虚拟机类不是任何 JRE 的一部分,因为它包含在 tools.jar 中,因此它只能从 JDK 获得。您可能希望将工具的内容.jar放入应用程序 jar 文件中,或者分发工具.jar并在运行时将其添加到类路径中。 您的代码将按预期运行,并将列出您的程序正在运行的 jvm,以及在同一 jvm 中运行的任何程序。