2009-10-23 6 views
2

C# 코드에서 javac를 호출하고 있습니다. 난 그냥 새 컴퓨터에 JDK를 설치하고 자동으로 JAVA_HOME 환경 변수를 설정하지 않은 것을 발견, 그러나javac.exe는 프로그래밍 방식으로 어떻게 찾습니까?

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

: 원래 나는 다음과 전용으로 위치를 발견했다. 환경 변수를 요구하는 는 지난 십에 대한 모든 Windows 응용 프로그램에서 받아 들일 수없는, 그래서 JAVA_HOME 환경 변수가 설정되어 있지 않은 경우 나 javac의를 찾을 수있는 방법이 필요합니다 :

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

+0

그들은 환경에 맞게 적절히 동기화하지 않기 때문에 구성하기가 힘들며 글쓰기가 힘듭니다. 사용자에게 복잡한 지시 사항. –

답변

4

는 Windows 사용 레지스트리에있는 경우 : 당신이, 당신은 꽤 많이 ENV 변수와 붙어 있지 않은 경우 자바 소프트 \ 자바 개발 키트

\

HKEY_LOCAL_MACHINE \ 소프트웨어. 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

+0

agiletrack.net url 작동하지 않아요. linuc에서 java_home 감지 – Udhaya

1

당신은 아마 JDK에 대한 레지스트리를 검색한다 설치 주소.

다른 방법으로는 this 토론을 참조하십시오.

0

64 비트 OS (윈도우 7)의 경우, 레지스트리 키가

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Development Kit

경우에 따라 할 수있다 32 비트 JDK를 실행 중입니다. 따라서 위의 코드를 모두 작성했으면 다시 테스트 해보십시오.

나는 아직도 Microsoft registry redirection/reflection 물건에 대해 완전히 머리를 쓰지 않았다.

관련 문제