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

Java 如何在现有JVM中运行程序?,java,jvm,Java,Jvm,我有一个已经在运行的JVM。我随身带着它的processID。 现在,我希望在这个JVM中运行一些其他Java代码,也就是说,代码应该在这个现有的JVM中运行,而不是旋转它自己的JVM 我已经看过了。 但是,它需要将代码打包到JAR中 还有其他方法吗?最简单的方法似乎是使用Attach API。然而,由于您不想使用它,您可能想在google上搜索RMI/JMS/JMX,这也允许您进行类似的操作 如果您使用标准的java命令启动程序,那么将为每个程序创建一个新的VM 然而,由于这看起来像一个XY问

我有一个已经在运行的JVM。我随身带着它的processID。 现在,我希望在这个JVM中运行一些其他Java代码,也就是说,代码应该在这个现有的JVM中运行,而不是旋转它自己的JVM

我已经看过了。 但是,它需要将代码打包到JAR中


还有其他方法吗?

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

如果您使用标准的
java
命令启动程序,那么将为每个程序创建一个新的VM

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

可以在VM的不同线程上运行程序

这里有一个有趣的代码片段,它将创建一个简单的启动器,然后您可以启动程序,将要启动的每个程序的主类作为main方法的参数,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();
    }
  }
}
公共类启动器{
公共静态void main(字符串[]args)引发异常{

对于(int i=0;ii如果它不在jar中,那么它是什么?你需要一个java编译器才能运行
.java
源代码文件,而这些文件通常不包含在JRE中。如果你想运行的代码不在jar中,那么它在哪里?我想你也可以通过各种调试API来计算字节码。也许可以使用附加API+检测AP一、 然后,您可以在VirtualMachine上加载代理,如JMX do。前面的回答应该有助于您调试应用程序这似乎是最好不要做的事情。但如果真的必须这样做,这是一种优雅的方式。这回答了一个不同的问题。问题是关于在现有JVM中从在外部,不在类路径上的类中启动main。@ThorbjørnRavnAndersen我知道问题是什么,并且我在开始时声明这是不可能的。但是,我给出了一个可能解决实际问题的替代方案。我非常确定这是一个XY问题。确定这是可能的。这就是创建Attach API的目的和目的例如,VisualVM的工作原理。如果java代码不在原始类路径上,您可以使用上述方法与
URLClassLoader
一起加载新类。