我正在尝试从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路径,最可靠的“长途”解决方案是什么?
非常感谢。
- 编辑 -
感谢GenericTypeTea和Stephen 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();
}
}
答案 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");
和繁荣。干杯