2009-10-23 127 views
2

我從C#代碼調用javac。最初,我發現它的位置僅如下:如何以編程方式查找javac.exe?

protected static string JavaHome 
{ 
    get 
    { 
     return Environment.GetEnvironmentVariable("JAVA_HOME"); 
    } 
} 

然而,我剛安裝了JDK在新電腦上,發現它沒有自動設置JAVA_HOME環境變量。 需要的環境變量是在任何Windows應用程序在過去十年中不能接受的,所以我需要一種方法來尋找javac如果JAVA_HOME環境變量未設置:

protected static string JavaHome 
{ 
    get 
    { 
     string home = Environment.GetEnvironmentVariable("JAVA_HOME"); 
     if (string.IsNullOrEmpty(home) || !Directory.Exists(home)) 
     { 
      // TODO: find the JDK home directory some other way. 
     } 

     return home; 
    } 
} 
+3

爲什麼不能接受?計算機應該如何神奇地知道可執行文件的安裝位置?他們不是介意讀者,他們是電腦,你必須告訴他們該怎麼做...... – amischiefr 2009-10-23 17:48:31

+0

因爲他們沒有在環境中正確同步,他們是一個配置的痛苦,我厭倦了寫作令人費解的指示給用戶。 – 2009-10-23 17:51:14

回答

4

如果您使用的是Windows,使用註冊表:

HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft的\ Java開發工具包

如果你沒有,你幾乎套牢ENV變量。您可能會發現this博客條目很有用。

通過280Z28編輯:

在其下方的註冊表項是一個CURRENTVERSION值。該值是用來尋找Java主在以下位置:
HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit\{CurrentVersion}\JavaHome

private static string javaHome; 

protected static string JavaHome 
{ 
    get 
    { 
     string home = javaHome; 
     if (home == null) 
     { 
      home = Environment.GetEnvironmentVariable("JAVA_HOME"); 
      if (string.IsNullOrEmpty(home) || !Directory.Exists(home)) 
      { 
       home = CheckForJavaHome(Registry.CurrentUser); 
       if (home == null) 
        home = CheckForJavaHome(Registry.LocalMachine); 
      } 

      if (home != null && !Directory.Exists(home)) 
       home = null; 

      javaHome = home; 
     } 

     return home; 
    } 
} 

protected static string CheckForJavaHome(RegistryKey key) 
{ 
    using (RegistryKey subkey = key.OpenSubKey(@"SOFTWARE\JavaSoft\Java Development Kit")) 
    { 
     if (subkey == null) 
      return null; 

     object value = subkey.GetValue("CurrentVersion", null, RegistryValueOptions.None); 
     if (value != null) 
     { 
      using (RegistryKey currentHomeKey = subkey.OpenSubKey(value.ToString())) 
      { 
       if (currentHomeKey == null) 
        return null; 

       value = currentHomeKey.GetValue("JavaHome", null, RegistryValueOptions.None); 
       if (value != null) 
        return value.ToString(); 
      } 
     } 
    } 

    return null; 
} 
+0

對於Linux用戶,我已經遇到了這個代碼示例,它也做了同樣的事情:http://agiletrack.net/samples/sample-detect-java.html – luvieere 2009-10-23 17:59:20

+0

agiletrack.net url not working,please post how to檢測linuc中的java_home – Udhaya 2016-06-13 10:06:52

1

你或許應該在註冊表中搜索一個JDK安裝地址。

作爲替代,請參閱this討論。

0

對於64位操作系統(Windows 7),該註冊表項可能是下

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Development Kit

如果你正在運行一個32位的JDK。所以,如果你已經根據上面的代碼編寫了代碼,那麼再次測試。

我還沒有完全掌握Microsoft registry redirection/reflection的東西。

相關問題