Bắt phiên bản Java khi chạy


128

Tôi cần khắc phục lỗi Java trong JDK 1.5 đã được sửa trong 1.6. Tôi đang sử dụng điều kiện sau:

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

Điều này sẽ làm việc cho các JVM khác? Có cách nào tốt hơn để kiểm tra điều này?

Câu trả lời:


41

Các bài viết này dường như đề xuất rằng việc kiểm tra 1.5hoặc 1.6tiền tố nên hoạt động, vì nó tuân theo quy ước đặt tên phiên bản phù hợp.

Bài viết kỹ thuật của Sun


1
Có cách nào để có được dù là Oracle hay Open?
Joe C

89

java.versionlà một thuộc tính hệ thống tồn tại trong mọi JVM. Có hai định dạng có thể cho nó:

  • Java 8 hoặc giảm: 1.6.0_23, 1.7.0, 1.7.0_80,1.8.0_211
  • Java 9 trở lên: 9.0.1, 11.0.4, 12,12.0.1

Đây là một mẹo để trích xuất phiên bản chính: Nếu đó là một 1.x.y_zchuỗi phiên bản, hãy trích xuất ký tự ở chỉ số 2 của chuỗi. Nếu đó là một x.y.zchuỗi phiên bản, hãy cắt chuỗi thành ký tự dấu chấm đầu tiên của nó, nếu một chuỗi tồn tại.

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

Bây giờ bạn có thể kiểm tra phiên bản thoải mái hơn nhiều:

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

7
Nó là ok cho 1.5 nhưng 1.6 không chính xác như một số dấu phẩy động.
Hà.

1
Bỏ qua độ chính xác của FP, đối với các nhu cầu của OP, mã được cung cấp ít nhất phải là (phiên bản> 1.5), không> =. Đối với OP: nếu bạn sử dụng so sánh Chuỗi hiện tại của mình, bạn có cần kiểm tra dưới 1,5 không?
Steven Mackenzie

1
@Ha: Có thể nhưng double version = 1.6Double.parseDouble("1.6")vẫn nên mang các mẫu bit cùng, phải không? Vì chúng tôi không làm mỹ phẩm về số lượng (chỉ so sánh đơn giản), thậm chí == sẽ hoạt động như mong đợi.
Aaron Digulla

1
nhưng sắp tới chúng tôi sẽ có phiên bản 1.1 một lần nữa ... hoặc có thể thay vì 1.10, chúng tôi bắt đầu với 2.0 [:-)
user85421

7
Trong Java 9, sẽ không có "1." ở phía trước Chuỗi sẽ bắt đầu bằng "9 ..."
Dave C

59

Điều gì về việc nhận phiên bản từ gói meta infos:

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

In ra một cái gì đó như:

1.7.0_13


9
Wow, đó là loại tâm trí của tôi. Mặc dù trong trường hợp của tôi, tất cả những gì tôi muốn là hai phần đầu tiên của phiên bản vì vậy:Runtime.class.getPackage().getSpecificationVersion()
Wesley Hartford

8
Runtime.class.getPackage().getImplementationVersion()dường như trở lại nulltrên JDK9.
tresf

Có lẽ điều này chỉ hoạt động khi nó được định nghĩa trong MANIFEST.MF?
Aaron Digulla


29

Cách đơn giản nhất ( java.specification.version ):

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

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

hoặc một cái gì đó như ( java.version ):

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

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

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

hoặc nếu bạn muốn phá vỡ tất cả ( java.r Yoon.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

Chỉ cần lưu ý rằng trong Java 9 trở lên, quy ước đặt tên là khác nhau. System.getProperty("java.version")trả lại "9"chứ không phải "1.9".


8

Không hoạt động, cần --posđánh giá gấp đôi:

    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

Ví dụ cho 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... Chuyện gì xảy ra khi version = 1.4fnào?
ADTC

À đúng, bạn đúng - 1.4f sẽ không bị bắt trong ví dụ trên. Ví dụ này chỉ thể hiện các hằng số của Apache Commons Lang thay thế cho các thuộc tính của Java :)
mvanle

Bạn có thể chỉnh sửa câu trả lời và thay đổi nó thành version <= 1.4f.. Thật không may SystemUtils, không cung cấp một isJavaVersionLessThanphương thức nhưng sau đó (may mắn thay) bạn cũng có thể đặt mã kế thừa trong một elsekhối, sạch hơn.
ADTC

Ơ ... "mệnh đề tinh ranh để bắt 1.4" ? Không nên 1.4fquay lại mã kế thừa?
ADTC

2
Tôi muốn đề nghị : if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }. Mã cụ thể ở trên, mã chung bên dưới, mã dự phòng ở dưới cùng.
ADTC

5

Đây là cách triển khai trong 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

Nếu bạn có thể có sự phụ thuộc vào các tiện ích apache, bạn có thể sử dụng org.apache.commons.lang3.SystemUtils.

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


1

Đây là câu trả lời từ @mvanle, được chuyển đổi thành Scala: scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.