2

我从 C# 代码调用 javac。最初我只找到它的位置如下:

protected static string JavaHome
{
    get
    {
        return Environment.GetEnvironmentVariable("JAVA_HOME");
    }
}

但是,我刚刚在新电脑上安装了JDK,发现它并没有自动设置JAVA_HOME环境变量。在过去十年中,任何 Windows 应用程序都不能接受环境变量要求,因此如果未设置 JAVA_HOME 环境变量,我需要一种方法来查找 javac:

protected static string JavaHome
{
    get
    {
        string home = Environment.GetEnvironmentVariable("JAVA_HOME");
        if (string.IsNullOrEmpty(home) || !Directory.Exists(home))
        {
            // TODO: find the JDK home directory some other way.
        }

        return home;
    }
}
4

3 回答 3

4

如果您在 Windows 上,请使用注册表:

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java 开发工具包

如果你不是,你几乎被环境变量困住了。您可能会发现博客条目很有用。

280Z28编辑:

该注册表项下方是 CurrentVersion 值。该值用于在以下位置查找 Java 主目录:
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\{CurrentVersion}\JavaHome

private static string javaHome;

protected static string JavaHome
{
    get
    {
        string home = javaHome;
        if (home == null)
        {
            home = Environment.GetEnvironmentVariable("JAVA_HOME");
            if (string.IsNullOrEmpty(home) || !Directory.Exists(home))
            {
                home = CheckForJavaHome(Registry.CurrentUser);
                if (home == null)
                    home = CheckForJavaHome(Registry.LocalMachine);
            }

            if (home != null && !Directory.Exists(home))
                home = null;

            javaHome = home;
        }

        return home;
    }
}

protected static string CheckForJavaHome(RegistryKey key)
{
    using (RegistryKey subkey = key.OpenSubKey(@"SOFTWARE\JavaSoft\Java Development Kit"))
    {
        if (subkey == null)
            return null;

        object value = subkey.GetValue("CurrentVersion", null, RegistryValueOptions.None);
        if (value != null)
        {
            using (RegistryKey currentHomeKey = subkey.OpenSubKey(value.ToString()))
            {
                if (currentHomeKey == null)
                    return null;

                value = currentHomeKey.GetValue("JavaHome", null, RegistryValueOptions.None);
                if (value != null)
                    return value.ToString();
            }
        }
    }

    return null;
}
于 2009-10-23T17:50:18.633 回答
1

您可能应该在注册表中搜索 JDK 安装地址。

作为替代方案,请参阅讨论。

于 2009-10-23T17:47:36.753 回答
0

对于 64 位操作系统 (Windows 7),注册表项可能位于

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Development Kit

如果您运行的是 32 位 JDK。因此,如果您都根据上述编写了代码,请再次进行测试。

我还没有完全理解微软注册表重定向/反射的东西。

于 2011-02-17T12:58:04.493 回答