Jak sprawdzić, czy JRE lub JDK jest zainstalowane

137

Mam jeden komputer, na którym celowo zainstalowałem JDK. Mam inny komputer z JRE, między innymi do testowania. Jednak kiedy dostałem aplikację java działającą na tym komputerze, a potem wypróbowałem ją na innym, narzekała, że ​​JDK jest wymagany. Jak mogę sprawdzić, czy JDK został w jakiś sposób zainstalowany w moim systemie? Uwaga: omawiany komputer to Mac.

PopKernel
źródło
1
Czy możesz opublikować pełny tekst błędu, w tym sposób, w jaki próbujesz go uruchomić? Nie potrzebujesz JDK do uruchomienia programu w Javie, wystarczy JRE.
Kevin Workman,
To był komputer przyjaciela - coś o instalowaniu narzędzi wiersza poleceń. Skomentuję ponownie, gdy będę miał okazję ponownie to sprawdzić.
PopKernel
Wygląda na to, że możesz mówić o upewnieniu się, że Java jest na twojej drodze, ale to tylko przypuszczenie. Tak czy inaczej, do uruchamiania programów Java potrzebujesz tylko środowiska JRE. Aby je skompilować, potrzebujesz JDK.
Kevin Workman
Tylko nieliczne programy java potrzebują JDK, IDE, kontenerów serwletów, takich jak tomcat do kompilowania stron JSP i kilka innych. W jakiej aplikacji występuje problem?
Arne Burmeister

Odpowiedzi:

162

Możesz otworzyć terminal i po prostu wpisać

java -version // this will check your jre version
javac -version // this will check your java compiler version if you installed 

powinno to pokazać wersję java zainstalowaną w systemie (zakładając, że ustawiłeś ścieżkę do javy w środowisku systemowym).

A jeśli nie, dodaj go przez

export JAVA_HOME=/path/to/java/jdk1.x

a jeśli nie jesteś pewien, czy w ogóle masz w systemie Javę, po prostu użyj findw terminalu

to znaczy find / -name "java"

Maciej Cygan
źródło
1
@MaciejCygan, Dlaczego moja JAVA_HOME wskazuje na JRE zamiast JDK?
Pacerier
@Pacerier Dlaczego ?? nie wiem, że na pewno lol !. Może nie masz zainstalowanego JDK? Uruchamianie systemu Windows lub Linux?
Maciej Cygan
@MaciejCygan, używam okien. Tak, mam też zainstalowany JDK.
Pacerier,
@Pacerier Możesz edytować / lub wprowadzić wpis, jeśli go nie znaleziono - wewnątrz zmiennych środowiskowych.
Maciej Cygan,
@MaciejCygan, tak, ale dlaczego moja JAVA_HOME wskazuje na JRE zamiast JDK?
Pacerier,
18

Zwykle instalacja jdk ma javac w zmiennych ścieżkach środowiskowych ... więc jeśli sprawdzisz javac w ścieżce, jest to całkiem dobry wskaźnik, że masz zainstalowany jdk.

Shiraaz.M
źródło
3
Zdaję sobie sprawę, że OP pytał o Maca, więc może być tam inaczej. Ale jeśli chodzi o system Windows, ten test nie wydaje się wiarygodny. Właśnie sprawdziłem i NIE mam javacna swojej ścieżce, ale mam zainstalowany jdk. (W moim przypadku mój JAVA_HOME jest wskazany C:\Program Files\Java\jdk1.8.0_45)
kmote
Tak, masz rację, ponieważ javac faktycznie znajduje się w% JAVA_HOME% \ bin
Hamed
6

@ maciej-cygan dobrze opisał proces, jednak aby znaleźć ścieżkę java:

$ which java

podaje ścieżkę do javapliku binarnego, który jest połączonym plikiem w /usr/binkatalogu. Kolejny:

$ cd /usr/bin/ && ls -la | grep java

znajdź wskazaną lokalizację, która jest następująca (dla mnie):

wprowadź opis obrazu tutaj następnie cddo wskazanego katalogu, aby znaleźć rzeczywisty katalog domowy dla Javy. Kolejny:

$ ls -la | grep java

co w tym przypadku wygląda następująco:

wprowadź opis obrazu tutaj

więc jak widać na zrzucie ekranu, mój katalog domowy Java to /usr/lib/jvm/java-11-openjdk-amd64. Więc odpowiednio muszę dodać JAVA_HOME do mojego profilu (bash .bashrc, .bash_profileitp zależności od systemu operacyjnego) jak poniżej:

JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64"

Proszę bardzo!

Shayan Amani
źródło
0

Ogólne, czyste rozwiązanie w języku Java.

W przypadku systemów Windows i MacOS można wywnioskować (w większości przypadków) ...

public static boolean isJDK() {
    String path = System.getProperty("sun.boot.library.path");
    if(path != null && path.contains("jdk")) {
        return true;
    }
    return false;
}

Jednak ... w systemie Linux nie jest to tak niezawodne ... Na przykład ...

  • Wiele środowisk JRE w systemie Linux zawiera openjdkścieżkę
  • Nie ma gwarancji, że środowisko JRE nie zawiera również JDK.

Więc bardziej bezpiecznym podejściem jest sprawdzenie istnienia javacpliku wykonywalnego.

public static boolean isJDK() {
    String path = System.getProperty("sun.boot.library.path");
    if(path != null) {
        String javacPath = "";
        if(path.endsWith(File.separator + "bin")) {
            javacPath = path;
        } else {
            int libIndex = path.lastIndexOf(File.separator + "lib");
            if(libIndex > 0) {
                javacPath = path.substring(0, libIndex) + File.separator + "bin";
            }
        }
        if(!javacPath.isEmpty()) {
            return new File(javacPath, "javac").exists() || new File(javacPath, "javac.exe").exists();
        }
    }
    return false;
}

Ostrzeżenie: to nadal się nie powiedzie w przypadku combo JRE + JDK, które zgłaszają sun.boot.library.pathidentyczne JRE między JRE i JDK. Na przykład JDK Fedory nie powiedzie się (lub przejdzie w zależności od tego, jak na to spojrzysz), gdy powyższy kod zostanie uruchomiony. Zobacz testy jednostkowe poniżej, aby uzyskać więcej informacji ...

Testy jednostkowe:

# Unix
java -XshowSettings:properties -version 2>&1|grep "sun.boot.library.path"
# Windows
java -XshowSettings:properties -version 2>&1|find "sun.boot.library.path"
    # PASS: MacOS AdoptOpenJDK JDK11
    /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/lib

    # PASS: Windows Oracle JDK12
    c:\Program Files\Java\jdk-12.0.2\bin

    # PASS: Windows Oracle JRE8
    C:\Program Files\Java\jre1.8.0_181\bin

    # PASS: Windows Oracle JDK8
    C:\Program Files\Java\jdk1.8.0_181\bin

    # PASS: Ubuntu AdoptOpenJDK JDK11
    /usr/lib/jvm/adoptopenjdk-11-hotspot-amd64/lib

    # PASS: Ubuntu Oracle JDK11
    /usr/lib/jvm/java-11-oracle/lib

    # PASS: Fedora OpenJDK JDK8
    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.141-1.b16.fc24.x86_64/jre/lib/amd64

    #### FAIL: Fedora OpenJDK JDK8
    /usr/java/jdk1.8.0_231-amd64/jre/lib/amd64
tresf
źródło
0

dany komputer to Mac.

Rozwiązanie tylko dla macOS:

/usr/libexec/java_home -v 1.8+ --exec javac -version

Gdzie 1.8+jest Java 1.8 lub nowsza.

Niestety, java_homepomocnik nie ustawia właściwego kodu powrotu, więc sprawdzenie, czy nie wystąpiły błędy, wymaga przeanalizowania danych wyjściowych (np. 2>&1 |grep -v "Unable"), Które różnią się w zależności od ustawień regionalnych.

Uwaga, Java może również istnieć w /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin, ale w chwili pisania tego nie wiem, że instaluje się tam środowisko JRE, które również zawiera javac.

tresf
źródło