2010-08-02 66 views
15

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

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

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

此代码不是独立于平台的,因为Windows可执行文件的名字为java.exe,不java。有没有办法让JVM可执行文件的路径考虑到平台的特性?

+0

JAVA_HOME指向JDK而不是JRE。所以如果用户没有安装JDK,那么你的运气不好。另外我*做*拥有JDK并且没有环境变量。还是一切正常。同样在Windows上,您可以将“.exe”放在要运行程序的文件名上。 – Joey 2010-08-02 22:57:06

+0

通过'java.home'系统属性,我不是指环境变量;相反,我的意思是存在于'System.getProperties()'中的属性。我已经验证JRE具有'java.home'的System属性。 在Windows中知道“.exe”扩展名是可选的,这很有用。谢谢。 – 2010-08-02 23:00:04

+0

你可以在Windows上做第一个注释并假设“bin/java.exe”,并假设其他平台上的“bin/java”。还有“javaw.exe”可以根据你想要做什么来考虑。 – 2010-08-03 02:35:44

回答

-4

您试图分叉整个JVM。

  1. 这是非常低效的,主要是因为另一个java进程的沉重。如果您重这样做,那么你的程序将是很慢,因为这个原因

存在

  • 线程但是,如果你真的必须,你可以尝试只执行java -arguments直接,因为大多数标准的Java安装将java放在cli路径上。

  • +0

    该问题没有提到启动的任何内容,所以您应该可能会说“如果你使用java.exe启动时要小心......”。问题只是关于如何获得正在运行的java exe。 – 2010-08-03 02:32:59

    +1

    除了jowierun写的内容,还有*可以分叉JVM: 1. JVM之间没有类加载冲突 - 这对于大型应用程序非常重要2.当运行昂贵的算法时,将其作为单独的进程运行是个好主意;它解决了内存限制 – 2010-08-05 22:39:56

    1

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

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

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

    +6

    这不能回答我的问题。我正在问如何在运行时确定JVM可执行文件的位置*,而不是JVM启动之前的先验。你假设我正在控制JVM如何被调用,事实并非如此。 – 2010-08-05 22:43:25

    1

    这个讨论有问题的一个有趣的讨论涵盖多个平台: Finding current executable's path without /proc/self/exe

    鉴于讨论,应该是可能的,如果你真的需要它,写一些JNI包装,的#ifdef当前平台和进行正确的本地通话。

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

    8

    你总是可以使用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"; 
    }