【问题标题】:How can I start a second Java process?如何启动第二个 Java 进程?
【发布时间】:2011-05-24 05:27:44
【问题描述】:

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

【问题讨论】:

    标签: java process runtime.exec


    【解决方案1】:

    您可以使用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 目录。

    【讨论】:

      【解决方案2】:

      一般来说是不可能的。

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

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

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


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

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

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

      【讨论】:

      • 有任何链接可以支持您的第一个声明吗?
      【解决方案3】:

      您是否尝试过使用 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 脚本中非常棘手。

      【讨论】:

      • 如果我理解它,那么启动 Java 进程并没有帮助任何我知道可执行文件的外部进程。但这就是问题所在。我不知道当前的可执行文件。
      猜你喜欢
      • 1970-01-01
      • 2015-05-10
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多