Preciso solucionar um bug do Java no JDK 1.5 que foi corrigido na 1.6. Estou usando a seguinte condição:
if (System.getProperty("java.version").startsWith("1.5.")) {
...
} else {
...
}
Isso funcionará para outras JVMs? Existe uma maneira melhor de verificar isso?
java.version
é uma propriedade do sistema que existe em todas as JVM. Existem dois formatos possíveis para isso: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
Aqui está um truque para extrair a versão principal: Se for uma
1.x.y_z
string de versão, extraia o caractere no índice 2 da string. Se for umax.y.z
sequência de versões, corte a sequência no primeiro caractere de ponto, se houver.Agora você pode verificar a versão com muito mais conforto:
fonte
double version = 1.6
eDouble.parseDouble("1.6")
ainda deve produzir o mesmo padrão pouco, certo? Como não fazemos aritmética no número (apenas uma comparação simples), mesmo == funcionará conforme o esperado.Que tal obter a versão das meta informações do pacote:
Imprime algo como:
1.7.0_13
fonte
Runtime.class.getPackage().getSpecificationVersion()
Runtime.class.getPackage().getImplementationVersion()
parece retornarnull
no JDK9.Runtime.version()
Desde o Java 9, você pode usar
Runtime.version()
, que retorna umRuntime.Version
:fonte
A maneira mais simples ( java.specification.version ):
ou algo como ( java.version ):
ou se você quiser dividir tudo ( java.runtime.version ):
fonte
Apenas observe que no Java 9 e acima, a convenção de nomenclatura é diferente.
System.getProperty("java.version")
retorna em"9"
vez de"1.9"
.fonte
Não funciona, precisa
--pos
avaliar o dobro:fonte
Exemplo para o Apache Commons Lang:
fonte
version < 1.4f
... O que acontece quandoversion = 1.4f
?version <= 1.4f
.. InfelizmenteSystemUtils
, não fornece umisJavaVersionLessThan
método, mas, felizmente, você também pode colocar o código legado em umelse
bloco, o que é mais limpo.1.4f
voltar ao código legado?if (SystemUtils.IS_JAVA_1_5) { /* 1.5 specific code */ } else if (SystemUtils.isJavaVersionAtLeast(1.6f)) { /* modern code */ } else { /* fall back to legacy code */ }
. Código específico acima, código genérico abaixo, código de fallback na parte inferior.Aqui está a implementação no JOSM :
fonte
Se você puder ter dependência de apache utils, poderá usar org.apache.commons.lang3.SystemUtils.
fonte
Não conhece outra maneira de verificar isso, mas isso: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties () "implica" java.version "é uma propriedade padrão do sistema, portanto, espero que trabalhe com outras JVMs.
fonte
Aqui está a resposta de @mvanle, convertida em Scala:
scala> val Array(javaVerPrefix, javaVerMajor, javaVerMinor, _, _) = System.getProperty("java.runtime.version").split("\\.|_|-b") javaVerPrefix: String = 1 javaVerMajor: String = 8 javaVerMinor: String = 0
fonte