23

如果我有一个由用户启动的 java jar 或类文件(假设 java 路径在环境变量中设置),那么我如何从代码中找出 java.exe/javaw.exe 的绝对路径文件正在启动。

就像在 ubuntu 上一样,我们可以运行:% which java它会显示路径。

但是在 Windows 上,如果我检查System.getenv()可能会发现多个路径,例如旧版本或新版本。如果通过 cmd 行,我运行java -version它不会显示路径。

您能否通过纯 java 或 windows 上的命令行告诉我如何找到 javaw.exe 的位置?

4

3 回答 3

34
String javaHome = System.getProperty("java.home");

您能否通过纯 Java 告诉我...在 Windows 上如何找到 javaw.exe 的位置?

例如

import java.io.File;

class JavawLocation {

    public static void main(String[] args) {
        String javaHome = System.getProperty("java.home");
        File f = new File(javaHome);
        f = new File(f, "bin");
        f = new File(f, "javaw.exe");
        System.out.println(f + "    exists: " + f.exists());
    }
}

输出

C:\Program Files (x86)\Java\jdk1.6.0_29\jre\bin\javaw.exe    exists: true
Press any key to continue . . .

是的,我相信这将在 JRE 中起作用。

于 2012-01-25T16:30:36.193 回答
4

在 Windows 上,java.library.path 系统属性以 bin 目录的路径开头,该目录包含用于运行 jar 文件的 java.exe。

这是有道理的,因为在 Windows 上,任何可执行文件查找 DLL 文件的第一个位置是包含可执行文件本身的目录。所以很自然,当 JVM 运行时,它首先查找 DLL 的地方是包含 java.exe 的目录。

您可以通过以下方式获取 java.exe 的路径:

final String javaLibraryPath = System.getProperty("java.library.path");
final File javaExeFile = new File(
  javaLibraryPath.substring(0, javaLibraryPath.indexOf(';')) + "\\java.exe"
);
final String javaExePath =
  javaExeFile.exists() ? javaExeFile.getAbsolutePath() : "java";

此代码是特定于 Windows 的 - 我对路径分隔符 (;) 和文件分隔符 () 进行了硬编码。我还回退到“java”,以防库路径技巧不知何故不起作用。

我已经在 Windows 7 上使用 Java 6 和 7 对此进行了测试。我尝试了 32 位和 64 位版本的 Java。

于 2015-02-10T19:10:44.647 回答
2

这是我提出的一个稍微更通用的解决方案。也许有用:

private static String javaExe()
{
    final String JAVA_HOME = System.getProperty("java.home");
    final File BIN = new File(JAVA_HOME, "bin");
    File exe = new File(BIN, "java");

    if (!exe.exists())
    {
        // We might be on Windows, which needs an exe extension
        exe = new File(BIN, "java.exe");
    }

    if (exe.exists())
    {
        return exe.getAbsolutePath();
    }

    try
    {
        // Just try invoking java from the system path; this of course
        // assumes "java[.exe]" is /actually/ Java
        final String NAKED_JAVA = "java";
        new ProcessBuilder(NAKED_JAVA).start();

        return NAKED_JAVA;
    }
    catch (IOException e)
    {
        return null;
    }
}
于 2017-10-20T15:26:44.863 回答