在运行时确定JVM可执行文件的位置

时间:2010-08-02 22:53:36

标签: java jvm filepath

如何在运行时获取当前运行的JVM的可执行文件的位置?我想使用ProcessBuilder类将另一个JVM实例化为子进程。

我知道有java.home System属性,但是这并没有指定JVM可执行文件的位置。我知道我可以做这样的事情来获得路径:

System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"

此代码与平台无关,因为Windows可执行文件的名称为java.exe,而不是java。有没有办法获取JVM可执行文件的路径,将平台的特性考虑在内?

5 个答案:

答案 0 :(得分:9)

您总是可以使用os.name来检查用户是否正在运行Windows。这将适用于OS X,Linux和Windows

String jvm_location;
if (System.getProperty("os.name").startsWith("Win")) {
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java.exe";
} else {
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java";
}

答案 1 :(得分:1)

是的,有一种方法可以获取JVM可执行文件的路径(如果存在)。将其包含在应用程序的配置中。有很多方法可以做到这一点:命令行参数 - java myApp.Main / path / to / Java;属性 - java -Dpath.to.java = / path / to / java;等

如果您想要真正的平台独立性,那么您的整个方案都存在缺陷,因为无法保证存在JVM可执行文件。我可以想象一个不需要java可执行文件的JVM。

如果你想要99.99%的平台独立性,那么我认为你有所需的工具。

答案 2 :(得分:1)

该主题对涉及多个平台的问题进行了有趣的讨论: Finding current executable's path without /proc/self/exe

鉴于讨论,如果你真的需要它,应该可以编写一些JNI包装器,#ifdef是当前平台并进行正确的本机调用。

如果您只在Linux上,'/ proc / self / exe'是指向正在运行的实际可执行文件的符号链接。这具有不依赖于任何环境变量(即PATH或JAVA_HOME)的优点。但正如我所说,它绝对不是平台独立的。

答案 3 :(得分:0)

以下代码通过使用当前ProcessHandle.InfoProcessHandle获取到当前class BitRunAdmin(admin.ModelAdmin): ordering = ('number',) list_display = ('well', 'run', 'od', 'tfa') list_filter = ['well'] search_fields = ['well'] 可执行文件的路径。

由于使用操作系统权限可能会限制对命令信息的访问,因此结果会封装在java中。

Optional

答案 4 :(得分:-4)

您正在尝试分叉整个JVM。

  1. 这是非常低效的,主要是因为另一个java进程的沉重。如果你做得很多,那么你的程序将会非常缓慢
  2. 出于这个原因存在线程
  3. 但是如果真的必须,你可以尝试直接执行java -arguments,因为大多数标准java安装都将java放在cli路径上。