Получение версии Java во время выполнения
Мне нужно обойти Java-ошибку в JDK 1.5, которая была исправлена в 1.6. Я использую следующее условие:
if (System.getProperty("java.version").startsWith("1.5.")) {
...
} else {
...
}
Будет ли это работать для других JVM? Есть ли лучший способ проверить это?
Ответы
Ответ 1
Эти статьи, по-видимому, предполагают, что проверка префикса 1.5
или 1.6
должна работать, поскольку она соответствует правильному назначению именования версий.
Технические статьи Sun
Ответ 2
java.version
- это стандартное свойство, которое существует в каждой JVM. Для этого есть два возможных формата:
- Java 8 или ниже:
1.6.0_23
, 1.7.0
, 1.7.0_80
, 1.8.0_211
- Java 9 или выше:
9.0.1
, 11.0.4
, 12
, 12.0.1
Вот трюк для извлечения основной версии: Если это 1.x.y_z
версии 1.x.y_z
, извлеките символ в индексе 2 строки. Если это строка версии xyz
, обрежьте строку до первого символа точки, если он существует.
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) {
// ...
}
Ответ 3
Как получить версию из пакета meta infos:
String version = Runtime.class.getPackage().getImplementationVersion();
Распечатывает что-то вроде:
1.7.0_13
Ответ 4
Самый простой способ (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];
Ответ 5
Начиная с Java 9, вы можете использовать Runtime.version()
, который возвращает Runtime.Version
:
Runtime.Version version = Runtime.version();
Ответ 6
Не работает, нужно --pos
оценить double:
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
Просто обратите внимание, что в Java 9 и выше соглашение об именах отличается. System.getProperty("java.version")
возвращает "9"
, а не "1.9"
.
Ответ 8
Пример для 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 :)
}
Ответ 9
Вот реализация в 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));
}
Ответ 10
Не знаю другого способа проверить это, но это: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties() " подразумевает, что" java.version "является стандартным системным свойством, поэтому я ожидаю, что он будет работать с другими JVM.
Ответ 11
Если у вас есть зависимость от apache utils, вы можете использовать org.apache.commons.lang3.SystemUtils.
System.out.println("Is Java version at least 1.8: " + SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8));
Ответ 12
Вот ответ от @mvanle, преобразованный в Scala:
scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b")
javaVerPrefix: String = 1
javaVerMajor: String = 8
javaVerMinor: String = 0