2010-06-14 11 views
21

मैं एक सी # असेंबली से गतिशील रूप से एक .jar चलाने की कोशिश कर रहा हूं (Process.Start(info) का उपयोग कर)। अब, एक सांत्वना आवेदन से मैं बस चलाने के लिए सक्षम हूँ:विंडोज जावा स्थापना स्थान कैसे निर्धारित करें

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

एक विधानसभा में, हालांकि, मैं का एक Win32Exception मिलती रहती है "सिस्टम निर्दिष्ट फ़ाइल नहीं मिल सकता है" और पूर्ण करने के लिए लाइन बदलने के लिए जावा का पथ इस तरह:

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

यह स्पष्ट रूप से नहीं करेगा। मुझे गतिशील रूप से (लेकिन घोषणात्मक रूप से) जावा के स्थापित स्थान को निर्धारित करने का एक तरीका चाहिए।

मैंने रजिस्ट्री को देखने की सोच शुरू कर दी, लेकिन जब मैं वहां गया तो मैंने देखा कि संस्करणों के लिए विशिष्ट कुंजी थीं और उन्हें संख्यात्मक होने की भी गारंटी नहीं दी जा सकती थी (उदाहरण के लिए "HKEY_LOCAL_MACHINE \ सॉफ़्टवेयर \ जावा सॉफ़्ट \ जावा रनटाइम पर्यावरण \ 1.6 "और" HKEY_LOCAL_MACHINE \ सॉफ़्टवेयर \ जावा सॉफ़्ट \ जावा रनटाइम पर्यावरण \ 1.6.0_20 ")।

सी # एप्लिकेशन से सबसे अद्यतित 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(); 
    } 
} 

उत्तर

24

आप इसे रजिस्ट्री के माध्यम से कर सकते हैं। हालांकि आप गलत जगह पर देख रहे थे। मैं एक साथ आप के लिए एक त्वरित उदाहरण खटखटाया:

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 
} 
+0

यह सही दिखता है! यह इंगित करने के लिए धन्यवाद कि मुझे 'CurrentVersion' याद आया। हालांकि, मैं 'आरके' पर नलरफ को प्राप्त करता रहता हूं।; ( – Lance

+1

यह एक आम सम्मेलन है कि उपयोगकर्ता "ऑटोडाइक्टेड" जावा पथ को "JAVA_HOME" नामक पर्यावरण चर के साथ ओवरराइट कर सकता है। प्रोग्रामर को टोपी का सम्मान करना चाहिए और उस चर की प्राथमिकता देना चाहिए: string java_path = Environment.GetEnvironmentVariable ("JAVA_HOME") ?? GetJavaInstallationPath(); –

+0

@ लांस - मैं जावा विशेषज्ञ नहीं हूं, इसलिए यह केवल एक सर्वोत्तम अनुमान है। क्या आपको यह देखने के लिए एक नजर है कि कुंजी क्या है? @SchlaWiener - आपके उत्तर को अपडेट करने के लिए मेरा उत्तर अपडेट किया गया टिप्पणी (मुझे लगता है) – GenericTypeTea

1

जहाँ तक मेरा विचार जानते हैं यह है कि सिस्टम पर स्थापित जावा का नवीनतम संस्करण पाथ पर्यावरण चर में पाया गया पहला है, इसलिए आपको किसी भी रजिस्ट्री कुंजियों की तलाश करने की आवश्यकता नहीं है, बस चीज़ चलाएं।

प्रयास करें:

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

यह सुनिश्चित करें कि java.exe अपने पथ में है काम नहीं करता है और मुझे पता है।

+0

दुर्भाग्य से, नहीं। अगर मैं 'info.EnvironmentVariables [" path "]' की जांच करता हूं, इसमें जावा नहीं है। दूसरी तरफ, अगर मैं सिर्फ एक कमांड प्रॉम्प्ट खोलता हूं, तो मैं सिर्फ 'java -jar somerandom.jar' पूरे दिन कर सकता हूं, इसलिए मुझे पता है कि यह वहां होना चाहिए। – Lance

+0

क्या आप यह जांच सकते हैं कि जब आप इसे कमांड प्रॉम्प्ट से चलाते हैं तो java.exe प्रक्रिया चलती है? – Grzenio

+0

@ लांसमे, और आपने वास्तव में प्रक्रिया के नाम के बाद एक्सटेंशन के साथ संस्करण की कोशिश की है? – Grzenio

0

बिल्डिंग @GenericTypeTea सवाल के शीर्ष पर - इस पर दोनों को देखने का तरीका एक रास्ता है 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; 
} 
+0

https://msdn.microsoft.com/en-us/library/dd411615(v=vs.110).aspx विंडोज के 64-बिट संस्करणों पर, रजिस्ट्री के भाग 32-बिट और 64- बिट अनुप्रयोगों। 32-बिट अनुप्रयोगों के लिए 32-बिट दृश्य और 64-बिट अनुप्रयोगों के लिए 64-बिट दृश्य है। यदि दृश्य रजिस्ट्री 64 है लेकिन रिमोट मशीन 32-बिट ऑपरेटिंग सिस्टम चला रही है, तो लौटाई गई कुंजी रजिस्ट्री 32 व्यू का उपयोग करेगी। – SimplyInk

+0

इसलिए रजिस्ट्री 64 व्यू से कुंजी खोलने के लिए कॉल 32/64-बिट ओएस दोनों मामलों को कवर करने के लिए पर्याप्त है। – SimplyInk

संबंधित मुद्दे