在运行时获取 Java 版本

我需要解决 JDK 1.5中的一个 Java 错误,这个错误在1.6中得到了修复。我使用以下条件:

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

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

175694 次浏览

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) {
// ...
}

这些文章似乎建议检查 1.51.6前缀应该有效,因为它遵循适当的版本变数命名原则。

Sun 技术文章

不工作,需要 --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;
}

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

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

打印出这样的东西:

1.7.0 _ 13

最简单的方法(版本) :

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 {
// ...
}

或者如果你想打破这一切(版本) :

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];

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

Runtime.version()

由于 Java9,您可以使用 Runtime.version(),它返回一个 Runtime.Version:

Runtime.Version version = Runtime.version();

需要注意的是,在 Java 9及以上版本中,变数命名原则是不同的,System.getProperty("java.version")返回的是 "9"而不是 "1.9"

如果您可以依赖于 apache utils,那么可以使用 org.apache.comms.lang3.SystemUtils。

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

下面是从@mvanle 转换到 Scala 的答案: Val Array (javaVerPrefix,javaVerMajor,javaVerMini,_,_) = System.getProperty (“ java.runtime.version”) . split (“ . | _ |-b”) 字符串 = 1 String = 8 字符串 = 0

下面是 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));
}

在 Kotlin:

/**
* Returns the major JVM version, e.g. 6 for Java 1.6, 8 for Java 8, 11 for Java 11 etc.
*/
public val jvmVersion: Int get() = System.getProperty("java.version").parseJvmVersion()


/**
* Returns the major JVM version, 1 for 1.1, 2 for 1.2, 3 for 1.3, 4 for 1.4, 5
* for 1.5 etc.
*/
fun String.parseJvmVersion(): Int {
val version: String = removePrefix("1.").takeWhile { it.isDigit() }
return version.toInt()
}

Https://docs.oracle.com/javase/9/docs/api/java/lang/runtime

 Runtime.version().version()

对于17.0.1,它返回[17.0,1] 可以使用 Runtime.version().version().get(0)获得主要的 Java 版本。