2013-07-11 48 views
6

私が取り組んでいるプロジェクトでは、javaw.exeがユーザのマシン上のどこにあるのかを知る必要があります。 どうすればいいですか?ユーザーがWindowsマシンであると仮定すると、javaw.exeのインストール場所を調べるには?

私が使用した方法は、英語版のWindowsに限ります。
OSがインストールされている場所を探して、Program Filesディレクトリを探し、Javajdkディレクトリ、bin、次にjavaw.exeを探します。私はこれが英語以外のバージョンのWindowsでは動作しないことを知っています。

これを行うための人間言語に依存しない方法は何ですか?

+0

あなたが実行ファイルが現在のJavaコード、または任意のjavaw.exeのを実行したいですか? –

+0

@AndyThomas任意です。複数の 'javaw.exe'が存在する場合、最新のものがあります:) –

+0

ファイルを検索し、実行可能ファイルからバージョンを取得するためのOS固有の検索APIがあります。 Windowsでは、Windows Search APIを使用して検索し、GetFileVersionInfo(...)を使用してバージョンを取得できます。検索には時間がかかることに注意してください。別の方法として、独自のJVMを出荷して、相対パスで見つけるのが簡単です。 –

答えて

8

をお試しください: (それでもReimeus'提案はあなたの最初の試みでなければなりません。)

1.
Javaは通常、それは次のキーの下に、レジストリ内の場所の店舗:
0 JRE/JDKのHKLM\Software\JavaSoft\Java Runtime Environement\<CurrentVersion>\JavaHome

2.
新しいバージョン、また中javaw.exeのコピーを配置するように見える 'C:\ WINDOWS \ System32に'、チャンスはあるものの、その1は、(あまりにもそこにチェックすることをお勧めしますそれがあれば、それは道でも見つかるだろう)。

  • 'C:\プログラムファイル\のJava \ JRE * \ binに'
  • 「C:\プログラムファイルもちろん

    3.
    はインストール場所 "通常" があります\ Javaの\ JDK * \ binに

  • 'C:\プログラムファイル(x86の)\ Javaの\ JRE * \ binに'
  • 'C:\プログラムファイル(x86の)は、Java \ JDK * \ binに'
  • \

[古いバージョンのWindows(XP、Vista(?))では、これは英語版のOSでのみ役立ちます。幸いにも、Windowsのそれ以降のバージョンでは、 "表示ファイル名"(言語固有)に関係なく、 "Program Files"がディレクトリを指します。上記の場所にjavaw.exe。たぶん誰かが重宝:

static protected String findJavaw() { 
    Path pathToJavaw = null; 
    Path temp; 

    /* Check in Registry: HKLM\Software\JavaSoft\Java Runtime Environement\<CurrentVersion>\JavaHome */ 
    String keyNode = "HKLM\\Software\\JavaSoft\\Java Runtime Environment"; 
    List<String> output = new ArrayList<>(); 
    executeCommand(new String[] {"REG", "QUERY", "\"" + keyNode + "\"", 
           "/v", "CurrentVersion"}, 
        output); 
    Pattern pattern = Pattern.compile("\\s*CurrentVersion\\s+\\S+\\s+(.*)$"); 
    for (String line : output) { 
     Matcher matcher = pattern.matcher(line); 
     if (matcher.find()) { 
      keyNode += "\\" + matcher.group(1); 
      List<String> output2 = new ArrayList<>(); 
      executeCommand(
        new String[] {"REG", "QUERY", "\"" + keyNode + "\"", 
            "/v", "JavaHome"}, 
        output2); 
      Pattern pattern2 
        = Pattern.compile("\\s*JavaHome\\s+\\S+\\s+(.*)$"); 
      for (String line2 : output2) { 
       Matcher matcher2 = pattern2.matcher(line2); 
       if (matcher2.find()) { 
        pathToJavaw = Paths.get(matcher2.group(1), "bin", 
              "javaw.exe"); 
        break; 
       } 
      } 
      break; 
     } 
    } 
    try { 
     if (Files.exists(pathToJavaw)) { 
      return pathToJavaw.toString(); 
     } 
    } catch (Exception ignored) {} 

    /* Check in 'C:\Windows\System32' */ 
    pathToJavaw = Paths.get("C:\\Windows\\System32\\javaw.exe"); 
    try { 
     if (Files.exists(pathToJavaw)) { 
      return pathToJavaw.toString(); 
     } 
    } catch (Exception ignored) {} 

    /* Check in 'C:\Program Files\Java\jre*' */ 
    pathToJavaw = null; 
    temp = Paths.get("C:\\Program Files\\Java"); 
    if (Files.exists(temp)) { 
     try (DirectoryStream<Path> dirStream 
       = Files.newDirectoryStream(temp, "jre*")) { 
      for (Path path : dirStream) { 
       temp = Paths.get(path.toString(), "bin", "javaw.exe"); 
       if (Files.exists(temp)) { 
        pathToJavaw = temp; 
        // Don't "break", in order to find the latest JRE version 
       }      
      } 
      if (pathToJavaw != null) { 
       return pathToJavaw.toString(); 
      } 
     } catch (Exception ignored) {} 
    } 

    /* Check in 'C:\Program Files (x86)\Java\jre*' */ 
    pathToJavaw = null; 
    temp = Paths.get("C:\\Program Files (x86)\\Java"); 
    if (Files.exists(temp)) { 
     try (DirectoryStream<Path> dirStream 
       = Files.newDirectoryStream(temp, "jre*")) { 
      for (Path path : dirStream) { 
       temp = Paths.get(path.toString(), "bin", "javaw.exe"); 
       if (Files.exists(temp)) { 
        pathToJavaw = temp; 
        // Don't "break", in order to find the latest JRE version 
       }      
      } 
      if (pathToJavaw != null) { 
       return pathToJavaw.toString(); 
      } 
     } catch (Exception ignored) {} 
    } 

    /* Check in 'C:\Program Files\Java\jdk*' */ 
    pathToJavaw = null; 
    temp = Paths.get("C:\\Program Files\\Java"); 
    if (Files.exists(temp)) { 
     try (DirectoryStream<Path> dirStream 
       = Files.newDirectoryStream(temp, "jdk*")) { 
      for (Path path : dirStream) { 
       temp = Paths.get(path.toString(), "jre", "bin", "javaw.exe"); 
       if (Files.exists(temp)) { 
        pathToJavaw = temp; 
        // Don't "break", in order to find the latest JDK version 
       }      
      } 
      if (pathToJavaw != null) { 
       return pathToJavaw.toString(); 
      } 
     } catch (Exception ignored) {} 
    } 

    /* Check in 'C:\Program Files (x86)\Java\jdk*' */ 
    pathToJavaw = null; 
    temp = Paths.get("C:\\Program Files (x86)\\Java"); 
    if (Files.exists(temp)) { 
     try (DirectoryStream<Path> dirStream 
       = Files.newDirectoryStream(temp, "jdk*")) { 
      for (Path path : dirStream) { 
       temp = Paths.get(path.toString(), "jre", "bin", "javaw.exe"); 
       if (Files.exists(temp)) { 
        pathToJavaw = temp; 
        // Don't "break", in order to find the latest JDK version 
       }      
      } 
      if (pathToJavaw != null) { 
       return pathToJavaw.toString(); 
      } 
     } catch (Exception ignored) {} 
    } 

    return "javaw.exe"; // Let's just hope it is in the path :) 
} 
+1

@LittleChild:あなたは既にそれを知っていたと知っています;) – gkalpak

+0

私はRegExを吸うので、簡単な方法を探していました。私はReimusの答えは 'ProcessBuilder'を使用して簡単な方法になります –

+0

Reimusの提案は私にとって完璧に動作します。 :) –

3

私はそれがパスにを発見していない場合にはjavaw.exeを探すために(のWindows PC上の)いくつかの場所があることを言及してみましょう、完全を期すためにこの

for %i in (javaw.exe) do @echo. %~$PATH:i 
+0

私はCMDでそれを実行しました。私は 'C:\ Program Files \ Java \ ..... 'とは異なる場所を取得しています。それはなぜですか? :) –

+0

基本的には、PATH上の各ディレクトリを反復して、 'dir \ javaw.exe'の存在を確認します。 – Reimeus

+0

はPATHで期待するものですか? – Reimeus

2

私はJRE 1.6および1.7のために、

for /f tokens^=2^ delims^=^" %%i in ('reg query HKEY_CLASSES_ROOT\jarfile\shell\open\command /ve') do set JAVAW_PATH=%%i 

これは、Windows XPで動作するはずセブン(バッチを使用して)使用するウィンドウで "javaw.exeの" を見つけるために。最新のインストールされたバージョンを取得する必要があります。

1

それは私に働いた:

String javaHome = System.getProperty("java.home"); 
    File f = new File(javaHome); 
    f = new File(f, "bin"); 
    f = new File(f, "javaw.exe"); //or f = new File(f, "javaws.exe"); //work too 
    System.out.println(f + " exists: " + f.exists()); 
0

オープンCMDシェルを、

cd \\ 
dir javaw.exe /s 
関連する問題