8

如何独立启动第二个 Java 进程平台?理想情况下,它应该与当前运行的 Java 版本相同。是否有任何有用的系统属性?

4

3 回答 3

10

您可以使用java.home系统属性来查找当前的 JVM:

String jvm = new java.io.File(new java.io.File(System.getProperty("java.home"),
                                               "bin"),
                              "java").getAbsolutePath();

然后使用ProcessBuilder(或Runtime.exec)运行它。

请注意,JDKjava.home指向包含在 JDK 中的 JRE 目录。

于 2010-12-12T12:42:14.830 回答
6

一般来说,这是不可能的。

@khachik 的答案中提供的配方不一定适用于 Java 的非 Sun 实现。

  • java 可执行文件不一定会被调用java,也不一定存在于bin子目录中。即使使用 Sun Java,在 Windows 上也有两个可执行文件;javajavaw

  • 用于启动 JVM 的命令的命令选项对于不同的 Java 实现是不同的。因此,该ProcessBuilder步骤可能涉及不可移植的参数。


尽管大多数 JVM 都采用了主要的 Sunjava命令选项,但仍有许多不同之处。例如:

  • IBM J9使用j9andj9w作为可执行文件名。
  • BEA / Oracle JRockit有不同的-X-XX选项。
  • Jikes RVM用作rvm可执行文件名,并且仅支持Sun选项的子集。java
  • IKVM用作ikvm可执行文件名。

(注意:这些只是粗略阅读相应在线文档时脱颖而出的示例。)

于 2010-12-12T13:39:45.433 回答
1

您是否尝试过使用 Apache Commons 库?如果您还没有尝试启动器项目。前段时间对我很有用。

这是他们网站上的项目描述:

Launcher 组件被设计成一个跨平台的 Java 应用程序启动器。

最初的 Java 类来自 Tomcat 4.0 项目。

Commons-launcher 不需要批处理或 shell 脚本来启动 Java 类。可能需要消除批处理或 shell 脚本的一些情况是:

  • 您希望避免必须确定某些应用程序路径的位置,例如应用程序的主目录等。在 Windows 批处理脚本中动态确定这一点在某些版本的 Windows 或在 Unix 平台上使用软链接时非常棘手。
  • 您希望避免处理本机文件和路径分隔符或本机路径引用问题。
  • 当使用 JDK 1.4 运行时,您需要强制执行某些系统属性,例如 java.endorsed.dirs。
  • 您希望允许用户传入自定义 JVM 参数或系统属性,而不必在脚本中解析和重新排序参数。这在批处理和 shell 脚本中可能很棘手和/或混乱。您希望从配置文件引导系统属性,而不是在批处理和 shell 脚本中硬编码它们。
  • 您想要提供本地化的错误消息,这在批处理和 shell 脚本中非常棘手。
于 2010-12-12T16:04:40.297 回答