我有一个已经在运行的 JVM。我有它的 processID。现在我希望在这个 JVM 中运行一些其他 Java 代码,即代码应该在这个现有的 JVM 中运行,而不是启动它自己的 JVM。
我已经查看了Attach API。但是它需要将代码打包在 JAR 中。
还有其他办法吗?
最简单的方法似乎是使用 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)
注意:我不知道您真正想要做什么,但如果要与大型应用程序一起使用,您可能需要增加堆属性以避免出现问题。