Мне нужно обойти ошибку Java в JDK 1.5, которая была исправлена в версии 1.6. Я использую следующее условие:
if (System.getProperty("java.version").startsWith("1.5.")) {
...
} else {
...
}
Будет ли это работать для других JVM? Есть ли лучший способ это проверить?
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
строка версии, обрежьте строку до первого символа точки, если таковой существует.Теперь проверить версию стало намного удобнее:
источник
double version = 1.6
иDouble.parseDouble("1.6")
все равно должны дать тот же битовый шаблон, верно? Поскольку мы не выполняем арифметические операции с числами (только простое сравнение), даже == будет работать должным образом.Как насчет получения версии из метаинформации пакета:
Распечатывает что-то вроде:
1.7.0_13
источник
Runtime.class.getPackage().getSpecificationVersion()
Runtime.class.getPackage().getImplementationVersion()
похоже, возвращаетсяnull
на JDK9.Runtime.version()
Начиная с Java 9, вы можете использовать
Runtime.version()
, который возвращаетRuntime.Version
:источник
Самый простой способ ( java.specification.version ):
или что-то вроде ( java.version ):
или если вы хотите все это разбить ( java.runtime.version ):
источник
Просто обратите внимание, что в Java 9 и выше соглашение об именах другое.
System.getProperty("java.version")
возвращается,"9"
а не"1.9"
.источник
Не работает, нужно
--pos
оценивать дважды:источник
Пример для Apache Commons Lang:
источник
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 :
источник
Если у вас может быть зависимость от утилит apache, вы можете использовать org.apache.commons.lang3.SystemUtils.
источник
Не знаю другого способа проверить это, но это: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties () "подразумевает, что" java.version "является стандартным системным свойством, поэтому я ожидаю работать с другими JVM.
источник
Вот ответ от @mvanle, преобразованного в Scala:
scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0
источник