在运行时获取Java版本


128

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

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

这对其他JVM有用吗?有没有更好的方法来检查这一点?

Answers:


41

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

Sun技术文章


1
有没有办法获取它是Oracle还是Open?
乔C

89

java.version是每个JVM中都存在的系统属性。有两种可能的格式:

  • Java的8或降低:1.6.0_231.7.01.7.0_801.8.0_211
  • Java的9或更高:9.0.111.0.41212.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以下的值?
史蒂文·麦肯齐

1
@Ha:也许,但double version = 1.6Double.parseDouble("1.6")仍然应该产生相同的位模式,对不对?由于我们不对数字进行算术运算(仅是简单的比较),因此即使==也可以按预期工作。
亚伦·迪古拉

1
但是很快我们将再次拥有1.1版...或者从1.10开始,而不是1.2.0 [:-)
user85421 '16

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中定义时有效吗?
亚伦·迪古拉


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 2014年

您可以编辑答案并将其更改为version <= 1.4f..不幸的是,SystemUtils它没有提供一种isJavaVersionLessThan方法,但是(幸运的是)您还可以将遗留代码放在一个else更干净的代码块中。
ADTC 2014年

...... “狡猾的条款要赶上1.4”?不应该1.4f回到传统代码吗?
ADTC 2014年

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 2014年

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 utils,则可以使用org.apache.commons.lang3.SystemUtils。

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


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.