रनटाइम पर जावा संस्करण प्राप्त करना


128

मुझे JDK 1.5 में एक जावा बग के आसपास काम करने की आवश्यकता है जो 1.6 में तय किया गया था। मैं निम्नलिखित शर्त का उपयोग कर रहा हूं:

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

क्या यह अन्य जेवीएम के लिए काम करेगा? क्या इसकी जाँच करने का कोई बेहतर तरीका है?

जवाबों:


41

इन लेखों से यह प्रतीत होता है कि इसके लिए 1.5या 1.6उपसर्ग की जाँच करना चाहिए, क्योंकि यह उचित संस्करण नामकरण सम्मेलन का अनुसरण करता है।

सूर्य तकनीकी लेख


1
क्या यह ओरेकल या ओपन प्राप्त करने का एक तरीका है?
जो सी

89

java.versionएक प्रणाली संपत्ति है जो हर JVM में मौजूद है। इसके लिए दो संभावित प्रारूप हैं:

  • जावा 8 या कम: 1.6.0_23, 1.7.0, 1.7.0_80,1.8.0_211
  • जावा 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
ओपी सटीक एक तरफ, ओपी की जरूरतों के लिए प्रदान किया गया कोड कम से कम होना चाहिए (संस्करण> 1.5), न कि = =। ओपी के लिए: यदि आप अपने वर्तमान स्ट्रिंग तुलना का उपयोग करते हैं तो क्या आपको 1.5 से नीचे की जांच करने की आवश्यकता है?
स्टीवन मैकेन्ज़ी

1
@Ha: हो सकता है लेकिन double version = 1.6और Double.parseDouble("1.6")अब भी वही बिट पैटर्न, सही उपज चाहिए? चूंकि हम संख्या (केवल एक साधारण तुलना) पर अंकगणित नहीं करते हैं, यहां तक ​​कि == अपेक्षा के अनुरूप काम करेंगे।
एरोन दिगुल्ला

1
लेकिन जल्द ही हमारे पास संस्करण 1.1 फिर से होगा ... या हो सकता है कि 1.10 के बजाय हम 2.0 से शुरू करें [:-)
user85421

7
जावा 9 में, "1." नहीं होगा सामने। स्ट्रिंग "9 ..." के साथ शुरू होगा
डेव सी

59

पैकेज मेटा इनोस से संस्करण प्राप्त करने के बारे में क्या:

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

कुछ इस तरह प्रिंट:

1.7.0_13


9
वाह, इस तरह मेरे दिमाग को उड़ा दिया। हालांकि मेरे मामले में, मैं चाहता था कि संस्करण के पहले दो भाग थे:Runtime.class.getPackage().getSpecificationVersion()
वेस्ले हार्टफोर्ड

8
Runtime.class.getPackage().getImplementationVersion()nullJDK9 पर लौटने लगता है ।
tresf

शायद यह केवल तभी काम करता है जब इसे MANIFEST.MF में परिभाषित किया गया हो?
आरोन दिगुल्ला

30

Runtime.version()

जावा 9 के बाद से, आप उपयोग कर सकते हैं Runtime.version(), जो एक रिटर्न देता है Runtime.Version:

Runtime.Version version = Runtime.version();

इको "System.err.print (रनटाइम.विज़न ()। मेजर ())" | $ JDK / bin / jshell 2> & 1> / dev / null
जुडोवाना

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

सिर्फ एक नोट कि जावा 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

अपाचे कॉमन्स लैंग के लिए उदाहरण:

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 के स्थिरांक को जावा की संपत्तियों के विकल्प के रूप में प्रदर्शित करना है :)
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

अगर आपको अपाचे बर्तनों पर निर्भरता हो सकती है तो आप 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> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.