【问题标题】:Execute Java main method from within a Java desktop app in a different JVM从不同 JVM 中的 Java 桌面应用程序中执行 Java main 方法
【发布时间】: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 的最佳方式吗? ](stackoverflow.com/questions/1229605/…) 了解详情。
  • 我相信没有办法像你建议的那样做。

标签: java jvm


【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-02
        • 2015-12-27
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 2018-02-03
        • 2012-10-17
        • 2013-05-16
        相关资源
        最近更新 更多