จะทราบได้อย่างไรว่าติดตั้ง JRE หรือ JDK แล้ว


134

ฉันมีคอมพิวเตอร์เครื่องหนึ่งที่ตั้งใจติดตั้ง JDK ฉันมีคอมพิวเตอร์เครื่องอื่นที่มี JRE สำหรับการทดสอบอื่น ๆ อย่างไรก็ตามเมื่อฉันได้รับแอปพลิเคชัน java ที่ทำงานบนคอมพิวเตอร์เครื่องนี้แล้วลองใช้กับเครื่องอื่นมันบ่นว่าจำเป็นต้องใช้ JDK ฉันจะตรวจสอบได้อย่างไรว่ามีการติดตั้ง JDK ในระบบของฉันหรือไม่? หมายเหตุ: คอมพิวเตอร์ที่เป็นปัญหาคือ Mac


1
คุณสามารถโพสต์ข้อความแบบเต็มของข้อผิดพลาดรวมถึงวิธีที่คุณพยายามเรียกใช้งานได้หรือไม่ คุณไม่จำเป็นต้องใช้ JDK เพื่อรันโปรแกรม Java เพียงแค่ JRE
Kevin Workman

มันเป็นคอมพิวเตอร์ของเพื่อน - บางอย่างเกี่ยวกับการติดตั้งเครื่องมือบรรทัดคำสั่ง ฉันจะแสดงความคิดเห็นอีกครั้งเมื่อมีโอกาสตรวจสอบอีกครั้ง
PopKernel

ดูเหมือนคุณอาจกำลังพูดถึงการทำให้แน่ใจว่า Java อยู่ในเส้นทางของคุณ แต่นั่นเป็นเพียงการคาดเดา ไม่ว่าจะด้วยวิธีใดคุณต้องใช้ JRE เพื่อรันโปรแกรม Java เท่านั้น คุณต้องใช้ JDK เพื่อรวบรวม
Kevin Workman

มีโปรแกรม Java เพียงไม่กี่โปรแกรมเท่านั้นที่ต้องการ JDK, IDEs, servlet container เช่น tomcat เพื่อรวบรวม JSPs และอื่น ๆ แอปพลิเคชันประเภทใดมีปัญหา
Arne Burmeister

คำตอบ:


159

คุณสามารถเปิดเทอร์มินัลและพิมพ์

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

สิ่งนี้ควรแสดงเวอร์ชันของ java ที่ติดตั้งบนระบบ (สมมติว่าคุณได้ตั้งค่าเส้นทางของ java ในสภาพแวดล้อมระบบ)

และหากยังไม่ได้เพิ่มให้เพิ่มผ่าน

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

และหากคุณไม่แน่ใจว่าคุณมี java อยู่หรือไม่ในระบบของคุณเพียงแค่ใช้findในเทอร์มินัล

กล่าวคือ find / -name "java"


1
@MaciejCygan ทำไม JAVA_HOME ของฉันถึงชี้ไปที่ JRE แทนที่จะเป็น JDK
Pacerier

@Pacerier ทำไม ?? ไม่รู้แน่ ๆ ฮ่า ๆ !. บางทีคุณอาจไม่ได้ติดตั้ง JDK? ใช้ windows หรือ linux ??
Maciej Cygan

@MaciejCygan ฉันใช้ windows ใช่ฉันติดตั้ง JDK แล้วด้วย
Pacerier

@Pacerier คุณสามารถแก้ไข / หรือสร้างรายการหากไม่พบ - ภายในตัวแปรสภาพแวดล้อมของคุณ
Maciej Cygan

@MaciejCygan ใช่ แต่ทำไม JAVA_HOME ของฉันถึงชี้ไปที่ JRE แทนที่จะเป็น JDK
Pacerier

18

โดยปกติการติดตั้ง jdk จะมี javac ในตัวแปรเส้นทางสภาพแวดล้อม ... ดังนั้นหากคุณตรวจสอบ javac ในพา ธ นั่นเป็นตัวบ่งชี้ที่ดีมากที่คุณติดตั้ง jdk


3
ฉันรู้ว่า OP กำลังถามเกี่ยวกับ Mac ดังนั้นจึงอาจแตกต่างกันที่นั่น แต่สำหรับ Windows การทดสอบนี้ดูเหมือนจะไม่น่าเชื่อถือ ฉันเพิ่งตรวจสอบและฉันไม่มีjavacในเส้นทางของฉัน แต่ฉันติดตั้ง jdk แล้ว (ในกรณีของฉัน JAVA_HOME ของฉันถูกชี้ไปที่C:\Program Files\Java\jdk1.8.0_45)
kmote

ใช่คุณพูดถูกเพราะ javac ตั้งอยู่ใน% JAVA_HOME% \ bin
Hamed

6

@ maciej-cygan อธิบายกระบวนการได้ดีอย่างไรก็ตามเพื่อค้นหาเส้นทาง java ของคุณ:

$ which java

มันให้เส้นทางของjavaไฟล์ไบนารีซึ่งเป็นไฟล์ที่เชื่อมโยงใน/usr/binไดเร็กทอรี ต่อไป:

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

ค้นหาตำแหน่งที่ชี้ซึ่งมีดังนี้ (สำหรับฉัน):

ป้อนคำอธิบายภาพที่นี่ จากนั้นcdไปที่ไดเร็กทอรีชี้เพื่อค้นหาโฮมไดเร็กทอรีจริงสำหรับ Java ต่อไป:

$ ls -la | grep java

ซึ่งมีดังต่อไปนี้ในกรณีนี้:

ป้อนคำอธิบายภาพที่นี่

เพื่อให้เป็นก็เห็นได้ชัดในภาพไดเรกทอรีบ้านของฉัน Java /usr/lib/jvm/java-11-openjdk-amd64เป็น ดังนั้นตามที่ฉันต้องการที่จะเพิ่ม JAVA_HOME ไปยังโปรไฟล์ทุบตีฉัน ( .bashrc, .bash_profileฯลฯ ขึ้นอยู่กับระบบปฏิบัติการของคุณ) เหมือนด้านล่าง:

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

จัดไป!


0

ตามเอกสารของ JAVA ควรติดตั้ง JDK ในเส้นทางนี้:

/Library/Java/JavaVirtualMachines/jdkmajor.minor.macro[_update].jdk

ดูส่วนการถอนการติดตั้ง JDK ที่https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html

ดังนั้นหากคุณพบโฟลเดอร์ดังกล่าวแสดงว่าติดตั้ง JDK แล้ว


0

โซลูชัน Java ธรรมดาทั่วไป ..

สำหรับ Windows และ MacOS สามารถอนุมานได้ดังต่อไปนี้ (โดยส่วนใหญ่) ...

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

อย่างไรก็ตาม ... บน Linux สิ่งนี้ไม่น่าเชื่อถือ ... ตัวอย่างเช่น ...

  • JREs จำนวนมากบน Linux มีopenjdkเส้นทาง
  • ไม่มีการรับประกันว่า JRE ไม่มี JDK ด้วย

ดังนั้นวิธีการที่ปลอดภัยกว่าคือการตรวจสอบการมีอยู่ของjavacปฏิบัติการ

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;
}

คำเตือน:สิ่งนี้จะยังคงล้มเหลวสำหรับคอมโบ JRE + JDK ซึ่งรายงานว่า JRE sun.boot.library.pathเหมือนกันระหว่าง JRE และ JDK ตัวอย่างเช่น JDK ของ Fedora จะล้มเหลว (หรือผ่านขึ้นอยู่กับว่าคุณมองอย่างไร) เมื่อมีการเรียกใช้โค้ดด้านบน ดูการทดสอบหน่วยด้านล่างสำหรับข้อมูลเพิ่มเติม ...

การทดสอบหน่วย:

# 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

0

คอมพิวเตอร์ที่เป็นปัญหาคือ Mac

โซลูชัน macOS เท่านั้น:

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

1.8+Java 1.8 หรือสูงกว่าอยู่ที่ไหน

น่าเสียดายที่java_homeผู้ช่วยเหลือไม่ได้ตั้งรหัสส่งคืนที่เหมาะสมดังนั้นการตรวจสอบความล้มเหลวจึงจำเป็นต้องแยกวิเคราะห์ผลลัพธ์ (เช่น2>&1 |grep -v "Unable") ซึ่งแตกต่างกันไปตามภาษา

หมายเหตุอาจมี Java อยู่/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/binด้วย แต่ในขณะที่เขียนสิ่งนี้ฉันไม่ทราบว่ามี JRE ที่ติดตั้งซึ่งมีอยู่javacด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.