রানটাইমে জাভা সংস্করণ পাওয়া যাচ্ছে


128

আমার জেডিকে 1.5 তে জাভা বাগের চারপাশে কাজ করা দরকার যা 1.6-এ স্থির হয়েছিল। আমি নিম্নলিখিত শর্তটি ব্যবহার করছি:

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

এটি কি অন্যান্য জেভিএমগুলির জন্য কাজ করবে? এটি যাচাই করার আরও ভাল উপায় আছে?

উত্তর:


41

এই নিবন্ধগুলিতে প্রস্তাবিত মনে হয় যে পরীক্ষা করা 1.5বা 1.6উপসর্গটি পরীক্ষা করা উচিত, কারণ এটি যথাযথ সংস্করণ নামকরণ কনভেনশন অনুসরণ করে।

সান প্রযুক্তি নিবন্ধ


1
এটি ওরাকল না খোলার উপায় আছে কি?
জো সি

89

java.versionএমন একটি সিস্টেম সম্পত্তি যা প্রতিটি জেভিএম-এ বিদ্যমান। এটির জন্য দুটি সম্ভাব্য বিন্যাস রয়েছে:

  • জাভা 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 দিয়ে শুরু করব [:-)
ব্যবহারকারী 85421

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

প্রতিধ্বনি "সিস্টেম.আরআরপ্রিন্ট (রানটাইম.ভার্সন ()। মেজর ())" | $ জেডিকে / বিন / জেসেল 2> & 1> / দেব / নাল
জুডোভানা

29

সবচেয়ে সহজ উপায় ( java.specifications.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 উপরের উদাহরণটিতে ধরা পড়বে না। উদাহরণটি কেবল অ্যাপাচি কমন্স ল্যাং-এর ধ্রুবককে জাভার সম্পত্তিগুলির বিকল্প হিসাবে দেখায় :)
ম্যানলে

আপনি উত্তরটি সম্পাদনা করতে এবং এটিকে পরিবর্তন করতে পারেন version <= 1.4f.. দুর্ভাগ্যক্রমে SystemUtilsকোনও isJavaVersionLessThanপদ্ধতি সরবরাহ না করে তবে (ভাগ্যক্রমে) আপনি উত্তরাধিকারের কোডটি একটি elseব্লকেও রেখে দিতে পারেন যা পরিষ্কার।
এডিটিসি

এরর ... "1.4 ধরার জন্য ডজি ক্লজ" ? 1.4fলিগ্যাসি কোডে ফিরে যাওয়া উচিত নয় ?
এডিটিসি

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 */ }। উপরে নির্দিষ্ট কোড, নীচে জেনেরিক কোড, খুব নীচে ফ্যালব্যাক কোড।
এডিটিসি

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.SistmUtils ব্যবহার করতে পারেন।

    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 "একটি স্ট্যান্ডার্ড সিস্টেমের সম্পত্তি তাই আমি এটি আশা করবো অন্যান্য জেভিএমের সাথে কাজ করুন।


1

এখানে @mvanle থেকে উত্তর, স্কালায় রূপান্তরিত হয়েছে: 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.