รับเวอร์ชัน Java ที่รันไทม์


128

ฉันต้องการแก้ไขข้อบกพร่องของ Java ใน JDK 1.5 ซึ่งได้รับการแก้ไขใน 1.6 ฉันใช้เงื่อนไขต่อไปนี้:

if (System.getProperty("java.version").startsWith("1.5.")) {
    ...
} else {
    ...
}

สิ่งนี้จะใช้ได้กับ JVM อื่น ๆ หรือไม่? มีวิธีตรวจสอบที่ดีกว่านี้หรือไม่?

คำตอบ:


41

บทความเหล่านี้ดูเหมือนจะแนะนำว่าการตรวจสอบ1.5หรือ1.6คำนำหน้าควรใช้งานได้เนื่องจากเป็นไปตามหลักการตั้งชื่อเวอร์ชันที่เหมาะสม

บทความทางเทคนิคของดวงอาทิตย์


1
มีวิธีรับไม่ว่าจะเป็น Oracle หรือ Open
Joe C

90

java.versionเป็นคุณสมบัติของระบบที่มีอยู่ในทุกๆ JVM มีสองรูปแบบที่เป็นไปได้:

  • Java 8 หรือลด: 1.6.0_23, 1.7.0, 1.7.0_80,1.8.0_211
  • Java 9 หรือสูงกว่า: 9.0.1, 11.0.4, 12,12.0.1

นี่คือเคล็ดลับในการแยกเวอร์ชันหลัก: หากเป็น1.x.y_zสตริงเวอร์ชันให้แยกอักขระที่ดัชนี 2 ของสตริง หากเป็นx.y.zสตริงเวอร์ชันให้ตัดสตริงเป็นอักขระจุดแรกหากมีอยู่

private static int getVersion() {
    String version = System.getProperty("java.version");
    if(version.startsWith("1.")) {
        version = version.substring(2, 3);
    } else {
        int dot = version.indexOf(".");
        if(dot != -1) { version = version.substring(0, dot); }
    } return Integer.parseInt(version);
}

ตอนนี้คุณสามารถตรวจสอบเวอร์ชันได้อย่างสะดวกสบายมากขึ้น:

if(getVersion() < 6) {
    // ...
}

7
ใช้ได้สำหรับ 1.5 แต่ 1.6 ไม่แม่นยำเป็นตัวเลขทศนิยม
ฮ่า.

1
ความแม่นยำของ FP กันสำหรับความต้องการของ OP รหัสที่ให้ไว้อย่างน้อยควรเป็น (เวอร์ชัน> 1.5) ไม่ใช่> = ไปที่ OP: ถ้าคุณใช้การเปรียบเทียบ String ปัจจุบันคุณต้องตรวจสอบด้านล่าง 1.5 ด้วยหรือไม่?
Steven Mackenzie

1
@Ha: อาจจะ แต่double version = 1.6และDouble.parseDouble("1.6")ยังควรให้รูปแบบบิตเดิมใช่ไหม? เนื่องจากเราไม่ได้คำนวณเลขคณิตกับจำนวน (เพียงการเปรียบเทียบแบบธรรมดา) แม้ == จะทำงานตามที่คาดไว้
Aaron Digulla

1
แต่เร็ว ๆ นี้เราจะมีเวอร์ชัน 1.1 อีกครั้ง ... หรืออาจจะแทนที่จะเป็น 1.10 เราเริ่มต้นด้วย 2.0 [:-)
user85421

7
ใน Java 9 จะไม่มี "1. " ข้างหน้า. สตริงจะเริ่มต้นด้วย "9 ... "
Dave C

59

สิ่งที่เกี่ยวกับการรับเวอร์ชันจากข้อมูลเมตาแพ็คเกจ:

String version = Runtime.class.getPackage().getImplementationVersion();

พิมพ์สิ่งที่ต้องการ:

1.7.0_13


9
ว้าวแบบนั้นพัดใจฉัน แม้ว่าในกรณีของฉันสิ่งที่ฉันต้องการคือสองส่วนแรกของเวอร์ชัน:Runtime.class.getPackage().getSpecificationVersion()
Wesley Hartford

8
Runtime.class.getPackage().getImplementationVersion()ดูเหมือนว่าจะกลับมาnullใน JDK9
tresf

อาจใช้ได้เฉพาะเมื่อกำหนดไว้ใน MANIFEST.MF?
Aaron Digulla


29

วิธีที่ง่ายที่สุด ( java.specification.version ):

double version = Double.parseDouble(System.getProperty("java.specification.version"));

if (version == 1.5) {
    // 1.5 specific code
} else {
    // ...
}

หรือบางอย่างเช่น ( java.version ):

String[] javaVersionElements = System.getProperty("java.version").split("\\.");

int major = Integer.parseInt(javaVersionElements[1]);

if (major == 5) {
    // 1.5 specific code
} else {
    // ...
}

หรือถ้าคุณต้องการทำลายมันทั้งหมด ( java.runtime.version ):

String discard, major, minor, update, build;

String[] javaVersionElements = System.getProperty("java.runtime.version").split("\\.|_|-b");

discard = javaVersionElements[0];
major   = javaVersionElements[1];
minor   = javaVersionElements[2];
update  = javaVersionElements[3];
build   = javaVersionElements[4];

11

โปรดทราบว่าใน Java 9 ขึ้นไปหลักการตั้งชื่อจะแตกต่างกัน System.getProperty("java.version")ผลตอบแทนที่มากกว่า"9""1.9"


8

ไม่ได้ผลต้อง--posประเมินสองครั้ง:

    String version = System.getProperty("java.version");
    System.out.println("version:" + version);
    int pos = 0, count = 0;
    for (; pos < version.length() && count < 2; pos++) {
        if (version.charAt(pos) == '.') {
            count++;
        }
    }

    --pos; //EVALUATE double

    double dversion = Double.parseDouble(version.substring(0, pos));
    System.out.println("dversion:" + dversion);
    return dversion;
}

7

ตัวอย่างสำหรับ Apache Commons Lang:

import org.apache.commons.lang.SystemUtils;

    Float version = SystemUtils.JAVA_VERSION_FLOAT;

    if (version < 1.4f) { 
        // legacy
    } else if (SystemUtils.IS_JAVA_1_5) {
        // 1.5 specific code
    } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) {
        // 1.6 compatible code
    } else {
        // dodgy clause to catch 1.4 :)
    }

1
version < 1.4f... จะเกิดอะไรขึ้นเมื่อversion = 1.4f?
ADTC

อ่าใช่คุณพูดถูก - 1.4f จะไม่ถูกจับในตัวอย่างด้านบน ตัวอย่างนี้แสดงให้เห็นเฉพาะค่าคงที่ของ Apache Commons Lang เพื่อเป็นทางเลือกให้กับคุณสมบัติของ Java :)
mvanle

คุณสามารถแก้ไขคำตอบและเปลี่ยนเป็นversion <= 1.4f.. น่าเสียดายที่SystemUtilsไม่มีisJavaVersionLessThanวิธีการ แต่แล้ว (โชคดี) คุณสามารถใส่รหัสเดิมในelseบล็อกซึ่งจะสะอาดกว่า
ADTC

เอ่อ ... "หลบข้อไปจับ 1.4" ? ไม่ควร1.4fถอยกลับไปใช้รหัสเดิม?
ADTC

2
ฉันขอแนะนำ: if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }. รหัสเฉพาะด้านบนรหัสทั่วไปด้านล่างรหัสสำรองที่ด้านล่างสุด
ADTC

5

นี่คือการใช้งานในJOSM :

/**
 * Returns the Java version as an int value.
 * @return the Java version as an int value (8, 9, etc.)
 * @since 12130
 */
public static int getJavaVersion() {
    String version = System.getProperty("java.version");
    if (version.startsWith("1.")) {
        version = version.substring(2);
    }
    // Allow these formats:
    // 1.8.0_72-ea
    // 9-ea
    // 9
    // 9.0.1
    int dotPos = version.indexOf('.');
    int dashPos = version.indexOf('-');
    return Integer.parseInt(version.substring(0,
            dotPos > -1 ? dotPos : dashPos > -1 ? dashPos : 1));
}

4

หากคุณสามารถพึ่งพายูทิลิตี้ apache ได้คุณสามารถใช้ org.apache.commons.lang3.SystemUtils

    System.out.println("Is Java version at least 1.8: " + SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8));

3

ไม่รู้วิธีอื่นในการตรวจสอบสิ่งนี้ แต่สิ่งนี้: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties () "บอกเป็นนัยว่า" java.version "เป็นคุณสมบัติมาตรฐานของระบบดังนั้นฉันจึงคาดหวังว่า ทำงานร่วมกับ JVM อื่น ๆ


1

นี่คือคำตอบจาก @mvanle แปลงเป็น Scala: scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0

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