在运行时获取Java版本

lis*_*ist 119 java jvm

我需要解决JDK 1.5中的Java错误,该错误已在1.6中修复.我使用以下条件:

if (System.getProperty("java.version").startsWith("1.5.")) {
    ...
} else {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这适用于其他JVM吗?有没有更好的方法来检查这个?

Aar*_*lla 71

java.version 是每个VM中存在的标准属性.

只有一个小技巧可以让你的生活更轻松:搜索第二个点并在那里剪切字符串.然后将其转换为1.6.0_23.现在,您可以更舒适地检查版本:

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);
}
Run Code Online (Sandbox Code Playgroud)

您可以将其放入类的静态代码中,因此它只运行一次:

if(getVersion() < 6) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 1.5适用,但1.6不精确作为浮点数. (7认同)
  • 在Java 9中,不会有"1".在前.该字符串将以"9 ..."开头 (7认同)

Ste*_*fan 55

如何从包元信息中获取版本:

String version = Runtime.class.getPackage().getImplementationVersion();
Run Code Online (Sandbox Code Playgroud)

打印出类似的东西:

1.7.0_13

  • 哇,这让我大吃一惊.虽然在我的情况下,我想要的只是版本的前两部分:`Runtime.class.getPackage().getSpecificationVersion()` (9认同)
  • `Runtime.class.getPackage().getImplementationVersion()`似乎在JDK9上返回`null`. (5认同)
  • 也许这只有在 MANIFEST.MF 中定义时才有效? (2认同)

pol*_*nts 39

这些文章似乎建议检查1.51.6前缀应该有效,因为它遵循正确的版本命名约定.

Sun技术文章

  • 既然版本控制语法从 Java 9 开始发生了变化,其他答案就更有用了。 (2认同)

mva*_*nle 28

最简单的方法(java.specification.version):

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

if (version == 1.5) {
    // 1.5 specific code
} else {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

或类似的东西(java.version):

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

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

if (major == 5) {
    // 1.5 specific code
} else {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

或者如果你想打破它(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];
Run Code Online (Sandbox Code Playgroud)


Eng*_*uad 23

从Java 9开始,您可以使用Runtime.version():

Runtime.Version version = Runtime.version();
Run Code Online (Sandbox Code Playgroud)

  • @judovana Runtime.version().major() 自 Java10 起已被弃用,等效的现在是 Runtime.version().feature()。 (3认同)

Sin*_*ani 9

请注意,在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;
}
Run Code Online (Sandbox Code Playgroud)


mva*_*nle 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 :)
    }
Run Code Online (Sandbox Code Playgroud)

  • 我建议:`if(SystemUtils.IS_JAVA_1_5){/*1.5特定代码*/}否则if(SystemUtils.isJavaVersionAtLeast(1.6f)){/*现代代码*/}否则{/*回退到遗留代码*/}`.上面的具体代码,下面的通用代码,最底层的回退代码. (2认同)

小智 6

如果您可以依赖 apache utils,您可以使用 org.apache.commons.lang3.SystemUtils。

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


sim*_*n04 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));
}
Run Code Online (Sandbox Code Playgroud)