从不同 JVM 中的 Java 桌面应用程序中执行 Java main 方法

Posted

技术标签:

【中文标题】从不同 JVM 中的 Java 桌面应用程序中执行 Java main 方法【英文标题】:Execute Java main method from within a Java desktop app in a different JVM 【发布时间】:2010-11-30 04:43:19 【问题描述】:

我有一个桌面应用程序,当有人按下按钮时,我希望它启动另一个执行类的 main 方法的 JVM。我的桌面应用程序已经依赖于包含我要执行的主要方法的类的 jar。

目前我有以下代码,但是,我希望它们是一种更优雅的方式:

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("java -jar another.jar");

我知道我也可以使用 ProcessBuilder。

有没有办法如(请原谅伪代码):

Jvm.execute(Main.class);

由于我要调用的 Main 类已经存在于我的类路径中,所以不得不通过 Runtime 运行 java 命令感觉很奇怪。

【问题讨论】:

你不能从你的代码中执行那个 main 方法? 您可以接受启动新的后台线程吗?在这种情况下,您甚至可以向用户报告任务完成情况。 我想要一个不同的 jvm。 没有用于启动另一个 JVM 的内置方法。这是您需要的基本代码,尽管您可以进行一些调整。请参阅 [this 真的是从 Java 代码启动第二个 JVM 的最佳方式吗? ](***.com/questions/1229605/…) 了解详情。 我相信没有办法像你建议的那样做。 【参考方案1】:

为什么需要在另一个 JVM 中执行这个 Main 类?它只会使事情复杂化。

通常只要 Main.main(args) 就可以了,但是:

如果您想将该程序与您的程序隔离,只需在另一个类加载器下运行它 - 请参阅 URLClassLoader 文档。请注意,即使是复杂的 Java 应用程序服务器也不会创建很多进程(通常它只是一个 JVM 进程),并且仅使用类加载器隔离已部署的 WAR 和 EAR。您可能会将类加载器视为 JVM 的进程等价物。

如果另一个程序执行某些“不安全”操作,请使用 java.security 中的 Java 安全机制并阻止该程序执行这些操作。

如果另一个程序调用 System.exit() 并且这会停止您的程序,则使用安全机制就足够了,并禁止该程序调用 System.exit() - 请参阅 System.exit() Javadoc。然后你可以捕获 SecurityException 并忽略它。

【讨论】:

【参考方案2】:

非常好的问题。尝试搜索管理API:http://cupi2.uniandes.edu.co/javadoc/j2se/1.5.0/docs/api/javax/management/package-frame.html

祝你好运。

我不确定此 API 是否存在,但如果存在,它应该存在。 我个人像您一样使用 ProcessBuilder,但通过检索当前进程的系统属性来指定 java 的显式路径。

【讨论】:

【参考方案3】:

HSQLDB 有一个通用的解决方案,可以为多个不同的进程调用主要方法。使用此类调用任何进程MainInvoker class source

【讨论】:

以上是关于从不同 JVM 中的 Java 桌面应用程序中执行 Java main 方法的主要内容,如果未能解决你的问题,请参考以下文章

JVM的理解

JVM学习:Java内存模型

浅析JVM

java_基础JVM内存模型和垃圾回收机制

java中的JVM解析

JVM中的JIT