在运行时获取Java版本

我需要解决在1.6版本中修复的JDK 1.5中的Java错误。 我正在使用以下条件:

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

这会为其他JVMs工作吗? 有没有更好的方法来检查这个?

这些文章似乎build议检查1.51.6前缀应该工作,因为它遵循适当的版本命名约定。

Sun技术文章

  • J2SE SDK / JRE版本string命名约定
  • 版本1.5.0或5.0?
    • “J2SE在一些只有开发者才能看到的版本号中保留了版本号1.5.0(或1.5),或者版本号被程序parsing的地方”
      • java.version系统属性”
  • 版本1.6.0由开发人员使用
    • “Java SE在一些只有开发者才能看到的版本号或版本号被程序parsing的地方保留了版本号1.6.0(或1.6)。”
      • java.version系统属性”

java.version是每个虚拟机中存在的标准属性。

这只是一个小小的窍门,可能会让你的生活变得更轻松:search第二个点,并在那里剪切string。 然后将其转换为double 。 现在,您可以更舒适地查看版本:

 if (version >= 1.5) ... 

你可以把它放到一个类的静态代码中,这样它只能运行一次:

 public static double JAVA_VERSION = getVersion (); static double getVersion () { String version = System.getProperty("java.version"); int pos = version.indexOf('.'); pos = version.indexOf('.', pos+1); return Double.parseDouble (version.substring (0, pos)); } 

那么从包元信息获取版本是什么:

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

打印出如下所示的内容:

1.7.0_13

最简单的方法( 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]; 

不工作,需要 – 评估双重:

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

从Java 9开始,您可以使用Runtime.version()

 Runtime.Version version = Runtime.version(); 
  • Runtime.Version JavaDoc 。

请注意,在Java 9及更高版本中,命名约定是不同的。 System.getProperty("java.version")返回"9"而不是"1.9"

不知道另一种检查方式,但这是: http : //java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties() “隐含”java.version “是一个标准的系统属性,所以我期望它能与其他JVM一起工作。

如果你可以依赖于apache utils,你可以使用org.apache.commons.lang3.SystemUtils。

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