如何在现有的 JVM 中运行程序?

Pra*_*nav 5 java jvm

我有一个已经在运行的 JVM。我有它的 processID。现在我希望在这个 JVM 中运行一些其他 Java 代码,即代码应该在这个现有的 JVM 中运行,而不是启动它自己的 JVM。

我已经查看了Attach API。但是它需要将代码打包在 JAR 中。

还有其他办法吗?

Jea*_*ard 1

最简单的方法似乎是使用 Attach API。然而,由于您不想使用它,您可能需要搜索 RMI/JMS/JMX,这也允许您进行类似的操作。

如果使用标准命令启动程序java,则会为每个程序创建一个新的虚拟机。

然而,由于这看起来像 XY 问题,这里有一个更简单的替代方案,可能会让您做您想做的事情。

可以在虚拟机的不同线程上运行程序。

这里有一个有趣的片段,它将创建一个简单的启动器,然后您可以启动程序,将要启动的每个程序的主类作为 main 方法的参数,该方法将为每个程序创建一个新线程,但所有内容都将在其上运行与启动器相同的虚拟机。

public class Launcher {
  public static void main(String[] args) throws Exception {
    for (int i = 0; i<args.length; i++) {
      final Class clazz = Class.forName(args[i]);
      new Thread(new Runnable() {
        @Override
        public void run() {
           try{
             Method main = clazz.getMethod("main", String[].class);
             main.invoke(null, new Object[]{});
           } catch(Exception e) {
             // improper exception handling - just to keep it simple
           }
        }
      }).start();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:我不知道您真正想要做什么,但如果要与大型应用程序一起使用,您可能需要增加堆属性以避免出现问题。

  • 这是回答一个不同的问题。问题是从外部在现有 JVM 中运行代码,而不是在类路径上的类中启动 main。 (2认同)