c# - Cómo determinar la ubicación de instalación de Windows Java
registry (3)
Estoy tratando de ejecutar dinámicamente un archivo .jar desde un ensamblado de C # (utilizando Process.Start(info)
). Ahora, desde una aplicación de consola puedo simplemente ejecutar:
ProcessStartInfo info = new ProcessStartInfo("java", "-jar somerandom.jar");
Sin embargo, en un ensamblaje, sigo obteniendo la Win32Exception
de "El sistema no puede encontrar el archivo especificado" y tengo que cambiar la línea a la ruta completa de Java, de esta forma:
ProcessStartInfo info = new ProcessStartInfo("C://Program Files//Java//jre6//bin//java.exe", "-jar somerandom.jar");
Esto obviamente no va a hacer. Necesito una forma de determinar dinámicamente (pero declarativamente) la ubicación instalada de Java.
Comencé a pensar en buscar en el registro, pero cuando llegué me di cuenta de que había claves específicas para las versiones y que no se podía garantizar que fueran numéricas (por ejemplo, "HKEY_LOCAL_MACHINE / SOFTWARE / JavaSoft / Java Runtime Environment / 1.6" y "HKEY_LOCAL_MACHINE / SOFTWARE / JavaSoft / Java Runtime Environment / 1.6.0_20").
¿Cuál sería la solución más confiable a largo plazo para encontrar la ruta java.exe más actualizada desde una aplicación C #?
Muchas gracias de antemano.
- EDITAR -
Gracias a una combinación de las GenericTypeTea de GenericTypeTea y Stephen Cleary , he resuelto el problema con lo siguiente:
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();
}
}
Por lo que sé, la idea es que la última versión de Java instalada en el sistema es la primera que se encuentra en la variable de entorno PATH, por lo que no debería tener que buscar ninguna clave de registro, solo ejecute la cosa.
Tratar:
ProcessStartInfo info = new ProcessStartInfo("java.exe", "-jar somerandom.jar");
Si no funciona, asegúrate de que java.exe esté en tu ruta y avísame.
Puedes hacerlo a través del registro. Aunque estabas buscando en el lugar equivocado. Junté un ejemplo rápido para ti:
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();
}
}
}
Entonces para usarlo, solo haz lo siguiente:
string installPath = GetJavaInstallationPath();
string filePath = System.IO.Path.Combine(installPath, "bin//Java.exe");
if (System.IO.File.Exists(filePath))
{
// We have a winner
}
Sobre la base de la pregunta @GenericTypeTea: esta es una forma de verificar ambas en x32 / x64.
static string GetJavaInstallationPath()
{
string environmentPath = Environment.GetEnvironmentVariable("JAVA_HOME");
if (!string.IsNullOrEmpty(environmentPath))
{
return environmentPath;
}
const string JAVA_KEY = "SOFTWARE//JavaSoft//Java Runtime Environment//";
var localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
using (var rk = localKey.OpenSubKey(JAVA_KEY))
{
if (rk != null)
{
string currentVersion = rk.GetValue("CurrentVersion").ToString();
using (var key = rk.OpenSubKey(currentVersion))
{
return key.GetValue("JavaHome").ToString();
}
}
}
localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
using (var rk = localKey.OpenSubKey(JAVA_KEY))
{
if (rk != null)
{
string currentVersion = rk.GetValue("CurrentVersion").ToString();
using (var key = rk.OpenSubKey(currentVersion))
{
return key.GetValue("JavaHome").ToString();
}
}
}
return null;
}