Sto provando a eseguire dinamicamente un .jar da un assembly C# (utilizzando Process.Start(info)
). Ora, da un'applicazione console sono in grado di eseguire solo:Come determinare il percorso di installazione di Windows Java
ProcessStartInfo info = new ProcessStartInfo("java", "-jar somerandom.jar");
In un assieme, però, continuo a ricevere un Win32Exception
di "Il sistema non riesce a trovare il file specificato" e deve cambiare la linea per il pieno percorso di Java in questo modo:
ProcessStartInfo info = new ProcessStartInfo("C:\\Program Files\\Java\\jre6\\bin\\java.exe", "-jar somerandom.jar");
Questo ovviamente non lo farà. Ho bisogno di un modo per determinare dinamicamente (ma in modo dichiarativo) il percorso installato di Java.
Ho iniziato a pensare al registro, ma quando sono arrivato ho notato che c'erano chiavi specifiche per le versioni e che non potevano nemmeno essere garantite come numeriche (ad es. "HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Runtime Ambiente \ 1.6 "e" HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft \ Java Runtime Environment \ 1.6.0_20 ").
Quale sarebbe la soluzione "a lungo raggio" più affidabile per trovare il percorso java.exe più aggiornato da un'applicazione C#?
Grazie molto in anticipo.
- EDIT -
Grazie ad una combinazione di GenericTypeTea 's e Stephen Cleary' risposte s, ho risolto il problema con il seguente:
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();
}
}
Questo sembra perfetto! Grazie per aver sottolineato che mi sono perso il 'CurrentVersion'. Continuo a ottenere NullRef su 'rk', però.; ( – Lance
È una convenzione comune che l'utente possa sovrascrivere il percorso java "autodetected" con una variabile di ambiente chiamata "JAVA_HOME". Un programmatore dovrebbe rispettare hat e dare la precedenza alle variabili: string java_path = Environment.GetEnvironmentVariable ("JAVA_HOME") ?? GetJavaInstallationPath(); –
@Lance: non sono un esperto di java, quindi questa è solo una supposizione migliore. Hai dato un'occhiata per vedere se la chiave è presente? @SchlaWiener - Aggiornamento della mia risposta per riflettere il tuo commento (credo) – GenericTypeTea