我有一个已经运行的JVM。我有它的processID。 现在我希望在这个JVM中运行一些其他Java代码,即代码应该在这个现有的JVM中运行,而不是自己编写JVM。
我已经查看了Attach API。 但是,它需要将代码打包在JAR中。
还有其他办法吗?
答案 0 :(得分:1)
最简单的方法似乎是使用Attach API。但是,由于您不想使用它,您可能想要了解RMI / JMS / JMX,这也可以让您进行类似的操作。
如果使用标准java
命令启动程序,则将为每个程序创建一个新VM。
然而,由于这看起来像XY问题,这里有一个更容易的选择,可能会让你做你想要的。
可以在VM的不同线程上运行程序。
这里有一个有趣的片段,可以创建一个简单的启动器,然后你可以启动程序,给你想要作为main方法的参数启动的每个程序的主类,它将为每个程序创建一个新的线程,但是一切都会在与启动器相同的VM上运行。
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();
}
}
}
注意:我不知道您真正想要做什么,但如果要与大型应用程序一起使用,您可能需要增加堆属性以避免出现问题。