我有一个桌面应用程序,当有人按下按钮时,我希望它启动另一个执行类主要方法的JVM。我的桌面应用程序已经依赖于包含具有我想要执行的主方法的类的jar。
目前我已经得到了以下代码,但是,我希望他们这样做是一种更优雅的方式:
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("java -jar another.jar");
我知道我也可以使用ProcessBuilder。
有没有这样的方法(原谅伪代码):
Jvm.execute(Main.class);
由于我想要调用的Main类已经存在于我的类路径中,因此必须通过Runtime运行java
命令感觉很奇怪。
答案 0 :(得分:2)
为什么需要在另一个JVM中执行此Main类?它只会让事情复杂化。
通常只有Main.main(args)可以,但是:
如果要将程序与程序隔离,只需在另一个类加载器下运行它 - 请参阅URLClassLoader文档。请注意,即使是复杂的Java应用程序服务器也不会创建许多进程(通常只是一个JVM进程),并且只使用类加载器隔离部署的WAR和EAR。您可以将classloader视为JVM等同于进程。
如果另一个程序执行某些“不安全”操作,请使用java.security中的Java安全机制,并阻止该程序执行这些操作。
如果另一个程序调用System.exit()并且这会停止你的程序,它就足以使用安全机制,并禁止该程序调用System.exit() - 请参阅System.exit()Javadoc。然后你可以捕获SecurityException并忽略它。
答案 1 :(得分:1)
非常好的问题。尝试搜索管理API:http://cupi2.uniandes.edu.co/javadoc/j2se/1.5.0/docs/api/javax/management/package-frame.html
祝你好运。我不确定这个API是否存在,但是如果它存在则应该存在。 我个人使用ProcessBuilder,但通过检索当前进程的系统属性来指定java的显式路径。
答案 2 :(得分:0)
HSQLDB有一个通用的解决方案,用于调用多个不同进程的主要方法。使用此类可以调用任何进程MainInvoker class source