【发布时间】:2011-05-24 05:27:44
【问题描述】:
如何启动第二个独立于平台的 Java 进程?理想情况下,它应该与当前运行的 Java 版本相同。有什么有用的系统属性吗?
【问题讨论】:
标签: java process runtime.exec
如何启动第二个独立于平台的 Java 进程?理想情况下,它应该与当前运行的 Java 版本相同。有什么有用的系统属性吗?
【问题讨论】:
标签: java process runtime.exec
您可以使用java.home系统属性来查找当前的JVM:
String jvm = new java.io.File(new java.io.File(System.getProperty("java.home"),
"bin"),
"java").getAbsolutePath();
然后使用ProcessBuilder(或Runtime.exec)运行它。
请注意,对于 JDK,java.home 指向 JDK 中包含的 JRE 目录。
【讨论】:
一般来说是不可能的。
@khachik 的答案中提供的配方不一定适用于 Java 的非 Sun 实现。
java 可执行文件不一定称为java,也不一定位于bin 子目录中。即使使用 Sun Java,在 Windows 上也有两个可执行文件; java 和 javaw。
启动 JVM 的命令的命令选项对于不同的 Java 实现是不同的。因此ProcessBuilder 步骤可能涉及不可移植的参数。
虽然大多数 JVM 都采用了主要的 Sun java 命令选项,但仍有许多不同之处。例如:
j9 和 j9w 作为可执行文件名称。-X 和 -XX 选项。 rvm 作为可执行文件名,并且仅支持 Sun 的 java 选项的子集。ikvm 作为可执行文件名。(注意:这些只是粗略阅读相应在线文档时脱颖而出的示例。)
【讨论】:
您是否尝试过使用 Apache Commons 库?如果您还没有尝试launcher project。前段时间对我很有用。
这是他们网站上的项目描述:
Launcher 组件被设计成一个跨平台的 Java 应用程序启动器。
原始的 Java 类来自 Tomcat 4.0 项目。
Commons-launcher 不需要批处理或 shell 脚本来启动 Java 类。可能需要消除批处理或 shell 脚本的一些情况是:
- 您希望避免必须确定某些应用程序路径的位置,例如您的应用程序的主目录等。在 Windows 批处理脚本中动态确定这一点在某些版本的 Windows 上或在 Unix 平台上使用软链接时非常棘手。
- 您希望避免处理本机文件和路径分隔符或本机路径引用问题。
- 您需要强制执行某些系统属性,例如使用 JDK 1.4 运行时的 java.endorsed.dirs。
- 您希望允许用户传入自定义 JVM 参数或系统属性,而不必在脚本中解析和重新排序参数。这在批处理和 shell 脚本中可能很棘手和/或混乱。 您希望从配置文件引导系统属性,而不是在批处理和 shell 脚本中硬编码。
- 您希望提供本地化的错误消息,这在批处理和 shell 脚本中非常棘手。
【讨论】: