如何确定Windows Java安装位置

时间:2010-06-14 14:39:56

标签: c# java windows registry

我正在尝试从C#程序集动态运行.jar(使用Process.Start(info))。现在,从控制台应用程序我可以运行:

ProcessStartInfo info = new ProcessStartInfo("java", "-jar somerandom.jar");

但是,在程序集中,我不断得到Win32Exception“系统无法找到指定的文件”,并且必须将行更改为Java的完整路径,如下所示:

ProcessStartInfo info = new ProcessStartInfo("C:\\Program Files\\Java\\jre6\\bin\\java.exe", "-jar somerandom.jar");

这显然不会这样做。我需要一种动态(但声明性地)确定Java安装位置的方法。

我开始考虑查看注册表,但是当我到达那里时,我注意到版本有特定的密钥,甚至不能保证它们是数字的(例如“HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Runtime Environment” \ 1.6“和”HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Runtime Environment \ 1.6.0_20“)。

从C#应用程序中找到最新的java.exe路径,最可靠的“长途”解决方案是什么?

非常感谢。

- 编辑 -

感谢GenericTypeTeaStephen Cleary的答案,我已解决了以下问题:

private String GetJavaInstallationPath()
{
    String javaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment";
    using (var baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(javaKey))
    {
        String currentVersion = baseKey.GetValue("CurrentVersion").ToString();
        using (var homeKey = baseKey.OpenSubKey(currentVersion))
            return homeKey.GetValue("JavaHome").ToString();
    }
}

5 个答案:

答案 0 :(得分:27)

您可以通过注册表执行此操作。你看错了地方。我为你敲了一个简单的例子:

private string GetJavaInstallationPath()
{
    string environmentPath = Environment.GetEnvironmentVariable("JAVA_HOME");
    if (!string.IsNullOrEmpty(environmentPath))
    {
       return environmentPath;
    }

    string javaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment\\";
    using (Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(javaKey))
    {
        string currentVersion = rk.GetValue("CurrentVersion").ToString();
        using (Microsoft.Win32.RegistryKey key = rk.OpenSubKey(currentVersion))
        {
            return key.GetValue("JavaHome").ToString();
        }
    }
}

然后使用它,只需执行以下操作:

string installPath = GetJavaInstallationPath();
string filePath = System.IO.Path.Combine(installPath, "bin\\Java.exe");
if (System.IO.File.Exists(filePath))
{
    // We have a winner
}

答案 1 :(得分:1)

据我所知,系统上安装的最新版本的Java是PATH环境变量中的第一个,因此您不需要查找任何注册表项,只需运行该项。

尝试:

ProcessStartInfo info = new ProcessStartInfo("java.exe", "-jar somerandom.jar");

如果它不起作用,请确保java.exe在您的路径中并告诉我。

答案 2 :(得分:1)

在@GenericTypeTea问题的基础上构建 - 这是一种如何在x32 / x64上进行检查的方法。

 List<int> intarr = new List<int>();
            intarr.Clear(); 
var gtrx = new Gtrx
                            {
                                CellId = int.Parse(PullValue(s, "CELLID")),
                                Freq = int.Parse(PullValue(s, "FREQ")),
                                TrxNo = int.Parse(PullValue(s, "TRXNO")),
                                IsMainBcch = PullValue(s, "ISMAINBCCH").ToUpper() == "YES",
                                Commabcch = new List<string> { PullValue(s, "ISMAINBCCH") },
                                DEFINED_TCH_FRQ = null,

                                TrxName = PullValue(s, "TRXNAME"),

                            };

 if (!intarr.Contains(gtrx.CellId))
                            {

                                if (!_dictionary.ContainsKey(gtrx.CellId))
                                {
                                    // No GCell record for this id. Do something!
                                    continue;
                                }
                                intarr.Add(gtrx.CellId);
                                string results = string.Empty;

                                    var result = String.Join(",",
        from ss in File.ReadLines(filename)
        where ss.Contains("ADD GTRX:")
        where int.Parse(PullValue(ss, "CELLID")) == gtrx.CellId
        where PullValue(ss, "ISMAINBCCH").ToUpper() != "YES"
        select int.Parse(PullValue(ss, "FREQ")));
                                    results = result;


                                var gtrxnew = new Gtrx
                                {
                                    DEFINED_TCH_FRQ = results
                                };

                                _dictionary[gtrx.CellId].Gtrx = gtrx;

答案 3 :(得分:0)

因为我找到了比所有者选择答案更好的解决方案,所以只是个小麻烦。

我发现它仅适用于32位Java,而今天,这已经过时了。因此,我对64位系统进行了调整。希望这可以帮助其他寻求方法的人。

        private string GetJavaInstallationPath()
        {
            string environmentPath = Environment.GetEnvironmentVariable("JAVA_HOME");
            if (!string.IsNullOrEmpty(environmentPath))
            {
                return environmentPath;
            }
            string javaKey = "SOFTWARE\\JavaSoft\\Java Runtime Environment\\";
            if (!Environment.Is64BitOperatingSystem)
            {
                using (Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(javaKey))
                {
                    string currentVersion = rk.GetValue("CurrentVersion").ToString();
                    using (Microsoft.Win32.RegistryKey key = rk.OpenSubKey(currentVersion))
                    {
                        return key.GetValue("JavaHome").ToString();
                    }
                }
            }
            else
            {
                using (var view64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                                                            RegistryView.Registry64))
                {
                    using (var clsid64 = view64.OpenSubKey(javaKey))
                    {
                        string currentVersion = clsid64.GetValue("CurrentVersion").ToString();
                        using (RegistryKey key = clsid64.OpenSubKey(currentVersion))
                        {
                            return key.GetValue("JavaHome").ToString();
                        }
                    }
                }
            }

        }

答案 4 :(得分:0)

首先,不要尝试从环境变量中获取Java JDK,请使用注册表项,它更有效并且会为您提供所需的任何东西。这是一个检查它是否存在的示例,如果存在,它可以返回当前版本的相对路径或名称。我花了几个小时来完成这项工作,希望对您有所帮助。如果它有助于停止使用32位JDK,那么我只提供64位解决方案。

public static string checkInstalled(string findByName)
    {
        string displayName;
        string InstallPath;
        string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";

        //64 bits computer
        RegistryKey key64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
        RegistryKey key = key64.OpenSubKey(registryKey);

        if (key != null)
        {
            foreach (RegistryKey subkey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
            {
                displayName = subkey.GetValue("DisplayName") as string;
                if (displayName != null && displayName.Contains(findByName))
                {

                    InstallPath = subkey.GetValue("InstallLocation").ToString();

                    return InstallPath; //or displayName

                }
            }
            key.Close();
        }

        return null;
    }

您可以像这样调用此方法

string JavaPath = Software.checkInstalled("Java(TM) SE Development Kit");

和繁荣。干杯