Cum să aflați unde este instalat javaw.exe? (Programare, Java, Windows, Javaw)

Un utilizator SO a intrebat.

Deci, pentru un proiect la care lucrez, trebuie să aflu unde se află un fișier javaw.exe se află pe calculatorul unui utilizator. Cum pot face acest lucru? Presupunând că utilizatorul este pe o mașină Windows

Metoda pe care am folosit-o este limitată doar la versiunile în limba engleză ale Windows.
Am căutat locul în care este instalat sistemul de operare, am localizat Program Files director, am localizat Java, jdk directorul, bin, apoi javaw.exe. Știu că acest lucru nu va funcționa pe versiunile de Windows care nu sunt în limba engleză.

Care este modalitatea independentă de limba umană de a face acest lucru ?

Comentarii

  • Doriți ca executabilul să ruleze codul Java curent sau orice javaw.exe arbitrar? –  > Por Andy Thomas.
  • @AndyThomas Orice arbitrar. În cazul în care mai multe javaw.exe există, atunci cel mai recent 🙂 –  > Por Un utilizator SO.
  • Există API-uri de căutare specifice sistemului de operare pentru găsirea fișierelor și pentru obținerea versiunii dintr-un executabil. Pe Windows, puteți utiliza API-ul de căutare Windows pentru a căuta și ::GetFileVersionInfo(…) pentru a obține versiunea. Rețineți că căutarea poate dura ceva timp până la finalizare. O alternativă este să vă livrați propria JVM, ceea ce face banală căutarea printr-o cale relativă. –  > Por Andy Thomas.
  • @LittleChild: Rețineți că, de obicei, nu veți găsi JDK instalat pe PC-ul unui utilizator obișnuit. Șansele dumneavoastră sunt mai mari dacă căutați o instalare JRE. –  > Por gkalpak.
5 răspunsuri
gkalpak

De dragul completitudinii, permiteți-mi să menționez că există câteva locuri (pe un PC cu Windows) pentru a căuta javaw.exe în cazul în care este nu se găsește în calea de acces: (Totuși, sugestia lui Reimeus ar trebui să fie prima încercare).

1.
Java își stochează de obicei locația în Registry, sub următoarea cheie:
HKLMSoftwareJavaSoftJava Runtime Environement<CurrentVersion>JavaHome

2.
Versiunile mai noi ale JRE/JDK, par să plaseze și o copie a javaw.exe în „C:WindowsSystem32”, așa că ar fi bine să se verifice și acolo (deși sunt șanse ca, dacă este acolo, să fie găsit și în calea de acces).

3.
Desigur, există locațiile „obișnuite” de instalare:

  • ‘C:Program FilesJavajre*bin’
  • ‘C:Program FilesJavajdk*bin’
  • ‘C:Program Files (x86)Javajre*bin’
  • ‘C:Program Files (x86)Javajdk*bin’

[Rețineți că, pentru versiunile mai vechi de Windows (XP, Vista(?)), acest lucru va fi de ajutor doar pentru versiunile în limba engleză ale sistemului de operare. Din fericire, la versiunile ulterioare de Windows, „Program Files” va indica directorul, indiferent de „numele de afișare” (care este specific limbii)].

Cu puțin timp în urmă, am scris această bucată de cod pentru a verifica dacă javaw.exe în locurile menționate mai sus. Poate că cineva o găsește utilă:

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

    /* Check in Registry: HKLMSoftwareJavaSoftJava 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:WindowsSystem32' */
    pathToJavaw = Paths.get("C:\Windows\System32\javaw.exe");
    try {
        if (Files.exists(pathToJavaw)) {
            return pathToJavaw.toString();
        }
    } catch (Exception ignored) {}

    /* Check in 'C:Program FilesJavajre*' */
    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)Javajre*' */
    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 FilesJavajdk*' */
    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)Javajdk*' */
    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 :)
}

Comentarii

  • Nu mă pricep deloc la RegEx, așa că am căutat o cale ușoară de ieșire. M-am gândit că răspunsul lui Reimus ar fi o cale de ieșire ușoară folosind ProcessBuilder –  > Por Un utilizator SO.
  • @LittleChild : Așa cum am spus, sugestia mea este o alternativă (pentru atunci când căutarea Path eșuează) – PATH-ul ar putea fi configurat corect în PC-ul dumneavoastră, dar s-ar putea să nu fie cazul pentru unii dintre utilizatorii dumneavoastră. –  > Por gkalpak.
  • Liek Reimus a spus că, dacă utilizatorul are instalat JRE, chestia cu calea nu va da greș. Dacă nu are instalat JRE, atunci orice program Java nu va rula :p –  > Por Un utilizator SO.
  • Reimus nu a spus ceea ce ai spus tu că a spus. El a descris ceea ce ar trebui să se întâmple (cu cele mai recente versiuni) – și este ceea ce se întâmplă în mod normal. Dar nu vă puteți baza pe comportamentul implicit sau așteptat, pentru că s-ar putea să dați greș 🙂 De asemenea, rețineți că, dacă verificați dintr-o aplicație Java, înseamnă că aplicația Java rulează, ceea ce înseamnă că Java este într-adevăr instalat. Așadar, dacă sunteți atât de sigur că, odată instalat, se adaugă singur la calea de acces, puteți la fel de bine să folosiți „javaw.exe” (nu trebuie să găsiți calea exactă a executabilului, deoarece Windows va căuta în PATH și îl va găsi pentru dumneavoastră 🙂 –  > Por gkalpak.
  • Cu JRE 1.8.0_111, PATH conține c:ProgramDataOracleJavajavapath, care conține pointeri .symlink pentru java.exe, javaw.exe și javaws.exe, toate cu căi absolute către fișierele reale din Program FilesJavajre1.8.0_111bin –  > Por stevek_mcc.
Reimeus

Încercați acest lucru

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

Comentarii

  • Ok, am executat-o în CMD. Primesc o locație diferită de C:Program FilesJava..... de ce se întâmplă asta ? 🙂 –  > Por Un utilizator SO.
  • Practic, trece prin fiecare director de pe PATH verificând existența lui dirjavaw.exe –  > Por Reimeus.
  • este cel pe care îl așteptați în PATH? –  > Por Reimeus.
  • Deci, pentru ca proiectul meu să ruleze corect, utilizatorul trebuie să fi setat Path care conține locația la javaw.exe ? 🙂 –  > Por Un utilizator SO.
  • Este în `C:Program FilesJavajdkxxxbin` 🙂 –  > Por Un utilizator SO.
Federico Destefanis

Pentru a găsi „javaw.exe” în windows aș folosi (folosind batch)

for /f tokens^=2^ delims^=^" %%i in ('reg query HKEY_CLASSES_ROOTjarfileshellopencommand /ve') do set JAVAW_PATH=%%i

Ar trebui să funcționeze în Windows XP și Seven, pentru JRE 1.6 și 1.7. Ar trebui să prindă cea mai recentă versiune instalată.

Comentarii

  • A funcționat foarte bine și pe Windows Server 2012 R2 Standard! Mulțumesc! –  > Por Venkat Janyavula.
Lini

A funcționat pentru mine:

    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());

David

Deschideți un shell cmd,

cd \
dir javaw.exe /s