有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

此代码不是独立于平台的,因为Windows可执行文件的名称是java.exe,而不是java。有没有一种方法可以获得考虑到平台特性的JVM可执行文件的路径


共 (5) 个答案

  1. # 1 楼答案

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

    鉴于上述讨论,如果您真的需要,应该可以编写一些JNI包装器,以#ifdef作为当前平台,并进行适当的本机调用

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

  2. # 2 楼答案

    您正在尝试分叉整个JVM

    1. 这是非常低效的,主要是因为另一个java进程非常繁重。如果你做得很重,那么你的程序会非常慢
    2. 线程的存在正是因为这个原因

    但是,如果您确实必须,您可以尝试直接执行java -arguments,因为大多数标准java安装都将java放在cli路径上

  3. # 3 楼答案

    下面的代码通过使用当前^{}^{}来获取当前java可执行文件的路径

    由于对命令信息的访问可能受到操作系统权限的限制,因此结果被包装在Optional

    String javaExecutablePath = ProcessHandle.current()
        .info()
        .command()
        .orElseThrow();
    
  4. # 4 楼答案

    你可以一直使用操作系统。检查用户是否运行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";
    }
    
  5. # 5 楼答案

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

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

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