Відповіді:
Ці статті, начебто, говорять про те, що перевірка на 1.5
або 1.6
префікса повинна працювати, оскільки це відповідає правильній конвенції про іменування версій.
java.version
властивість системи"java.version
властивість системи"java.version
- це системна властивість, яка існує у кожному JVM. Для цього є два можливі формати:
1.6.0_23
,1.7.0
, 1.7.0_80
,1.8.0_211
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) {
// ...
}
double version = 1.6
і Double.parseDouble("1.6")
все одно повинні дати той же бітовий шаблон, вірно? Оскільки ми не займаємося арифметикою числа (лише просте порівняння), навіть == буде працювати, як очікувалося.
Як щодо отримання версії з мета-інформації пакета:
String version = Runtime.class.getPackage().getImplementationVersion();
Виводить щось на зразок:
1.7.0_13
Runtime.class.getPackage().getSpecificationVersion()
Runtime.class.getPackage().getImplementationVersion()
здається, повертається null
на JDK9.
Runtime.version()
Оскільки Java 9, ви можете використовувати Runtime.version()
, що повертає Runtime.Version
:
Runtime.Version version = Runtime.version();
Найпростіший спосіб ( 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];
Лише зауважте, що в Java 9 і вище умова іменування різна. System.getProperty("java.version")
повернення, "9"
а не "1.9"
.
Не працює, потрібно --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;
}
Приклад для 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 :)
}
version < 1.4f
... Що відбувається, коли version = 1.4f
?
version <= 1.4f
. На жаль, SystemUtils
це не забезпечує isJavaVersionLessThan
метод, але тоді (на щастя) ви також можете поставити застарілий код у else
блок, який є більш чистим.
1.4f
повернутися до застарілого коду?
if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }
. Конкретний код вище, загальний код внизу, резервний код внизу.
Ось реалізація в 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));
}
Не знаю іншого способу перевірки цього, але це: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties () "означає, що" java.version "є стандартною властивістю системи, тому я очікую, що це робота з іншими СВМ.
Ось відповідь від @mvanle, перетвореної на Scala:
scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b")
javaVerPrefix: String = 1
javaVerMajor: String = 8
javaVerMinor: String = 0