2013-07-11 25 views
6

Quindi, per un progetto su cui sto lavorando, ho bisogno di scoprire dove si trova uno javaw.exe sulla macchina di un utente. Come faccio?Supponendo che l'utente sia su Windows macchinaCome trovare dove è installato javaw.exe?

Il metodo che ho usato è limitata a versioni in lingua inglese di Windows solo.
Ho cercato in cui è installato il sistema operativo, individuare la directory Program Files, individuare Java, jdk directory, bin, quindi javaw.exe. So che questo non funzionerà su versioni non inglesi di Windows.

Qual è il modo indipendente dal linguaggio umano per farlo?

+0

Vuoi l'eseguibile che esegue il codice Java corrente, o qualsiasi javaw.exe arbitraria? –

+0

@AndyThomas Qualsiasi arbitrario. Se esistono più 'javaw.exe', quindi l'ultimo :) –

+0

Esistono API di ricerca specifiche del sistema operativo per trovare i file e per ottenere la versione da un eseguibile. Su Windows, puoi utilizzare l'API di ricerca di Windows per cercare e :: GetFileVersionInfo (...) per ottenere la versione. Si noti che la ricerca può richiedere del tempo per il completamento. Un'alternativa è quella di spedire la propria JVM, rendendo banale la ricerca di un percorso relativo. –

risposta

8

Per ragioni di completezza, mi permetta di dire che ci sono alcuni posti (su un PC Windows) per cercare javaw.exe nel caso sia non trovato nel percorso: (Ancora suggerimento Reimeus' dovrebbe essere il tuo primo tentativo.)

1.
Java di solito memorizza la sua posizione nel Registro di sistema, nella seguente chiave:
HKLM\Software\JavaSoft\Java Runtime Environement\<CurrentVersion>\JavaHome

2.
recenti versioni di JRE/JDK, sembrano mettere anche una copia di javaw.exe in 'C: \ Windows \ System32', così si potrebbe voler controllare anche lì (anche se le probabilità sono, se è lì, sarà trovato anche nel percorso).

3.
Naturalmente ci sono i "soliti" install posizioni:

  • 'C: \ Program Files \ Java \ jre * \ bin'
  • 'C: \ Program Files \ Java \ JDK * \ bin'
  • 'C: \ Program Files (x86) \ Java \ jre * \ bin'
  • 'C: \ Program Files (x86) \ Java \ JDK * \ bin'

[Si noti che per le versioni precedenti di Windows (XP, Vista (?)), Questo è utile solo nelle versioni inglesi del sistema operativo. Fortunatamente, nella versione successiva di Windows "Program Files" punterà alla directory indipendentemente dal suo "nome visualizzato" (che è specifico della lingua).]

Un po 'di tempo fa, ho scritto questo pezzo di codice per verificare javaw.exe nei suddetti luoghi. Forse qualcuno lo trova utile:

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: so che lo sapevi già, però;) – gkalpak

+0

Succhio RegEx quindi cercavo una via d'uscita facile. Io penso che la risposta di Reimus sarebbe una facile via d'uscita usando 'ProcessBuilder' –

+0

Il suggerimento di Reimus funziona perfettamente per me. :) –

3

Prova questo

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

Ok, l'ho eseguito in CMD. Sto ottenendo una posizione diversa da 'C: \ Programmi \ Java \ ..... 'perché è così? :) –

+0

Fondamentalmente itera su ogni directory sul PATH verificando l'esistenza di 'dir \ javaw.exe' – Reimeus

+0

è quello che ci si aspetta sul PERCORSO? – Reimeus

2

di trovare "javaw.exe" in finestre avrei usato (usando lotto)

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

Dovrebbe funzionare in Windows XP e Seven, per JRE 1.6 e 1.7 . Dovrebbe prendere l'ultima versione installata.

1

ha funzionato per me:

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

Aprire una shell cmd,

cd \\ 
dir javaw.exe /s 
Problemi correlati