如何启动第二个 Java 进程?

发布于 2024-10-07 02:16:04 字数 67 浏览 1 评论 0原文

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

How can I start a second Java process platform independent? Ideally it should be the same Java version that currently running. Are there any helpful system properties?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

岁月无声 2024-10-14 02:16:07

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

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

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

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


虽然大多数 JVM 都采用了主要的 Sun java 命令选项,但仍存在许多差异。例如:

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

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

It is not possible, in general.

The recipe provided in @khachik's answer will not necessarily work for a non Sun implementation of Java.

  • The java executable is not necessarily called java and doesn't necessarily live in the bin subdirectory. Even with Sun Java, on Windows there are two executables; java and javaw.

  • The command options for the command that starts a JVM are different for different Java implementations. So the ProcessBuilder step may involve non-portable arguments.


While most JVMs have adopted the primary Sun java command options, there are numerous differences. For example:

  • IBM J9 uses j9 and j9w as the executable names.
  • BEA / Oracle JRockit has different -X and -XX options.
  • Jikes RVM uses rvm as the executable name, and only supports a subset of Sun's java options.
  • IKVM uses ikvm as the executable name.

(Note: these are just examples that stand out in a cursory reading of the respective online documentation.)

作死小能手 2024-10-14 02:16:07

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

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

启动器组件被设计为跨平台 Java 应用程序启动器。

原始的Java类来自Tomcat 4.0项目。

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

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

Have you tried using the Apache Commons libs? If you haven't give the launcher project a try. It was quite useful for me some time ago.

Here's the project description from their site:

The Launcher Component is designed to be a cross platform Java application launcher.

The original Java classes come from the Tomcat 4.0 project.

Commons-launcher eliminates the need for a batch or shell script to launch a Java class. Some situations where elimination of a batch or shell script may be desirable are:

  • You want to avoid having to determining where certain application paths are e.g. your application's home directory, etc. Determining this dynamically in a Windows batch scripts is very tricky on some versions of Windows or when softlinks are used on Unix platforms.
  • You want to avoid having to handle native file and path separators or native path quoting issues.
  • You need to enforce certain system properties e.g. java.endorsed.dirs when running with JDK 1.4.
  • You want to allow users to pass in custom JVM arguments or system properties without having to parse and reorder arguments in your script. This can be tricky and/or messy in batch and shell scripts.
    You want to bootstrap system properties from a configuration file instead hard-coding them in your batch and shell scripts.
  • You want to provide localized error messages which is very tricky to do in batch and shell scripts.
最好是你 2024-10-14 02:16:06

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

You can use java.home system property to find the current JVM:

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

and then run it using ProcessBuilder (or Runtime.exec).

Note that for JDK java.home points to the JRE directory included in JDK.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文