如何从程序中查找JVM版本?

147

我想编写一个Java示例文件,在其中我想知道类在哪个JVM版本中运行。有办法吗?


3
一些注意事项。系统属性是为此而设计的,但请记住这是一个特权操作,小程序/网络启动/沙盒代码将无法执行它(会收到SecurityException)。通常你希望以类似的方式运行它AccessController.doPrivileged(new PrivilegedAction<String>(...)); - bestsss
3
@bestsss,有些属性仅适用于可信的小程序:java.specification.versionjava.versionjava.vm.version这三个属性都可以在沙盒小程序中使用,至少在1.6.0_23版本中是可以的。请参考我的回答以获取更多细节信息。 - Andrew Thompson
1
还有一个可能有效的方法:java -version :) - badp
2
可能是在运行时获取Java版本的重复问题。 - BuZZ-dEE
11个回答

0
我们可以使用JVM运行时的类字节码版本与所需的JVM版本进行检查:
这个解决方案不依赖于任何枚举常量等,而且向后兼容。
注意:无论当前执行类的字节码版本还是运行时类路径中的其他类/ JAR文件的字节码版本如何,此解决方案都能正常工作,因为该属性反映了给定JDK版本的分配字节码版本。
例如:如果一个类在sourceCompatibility/targetCompatiblity 1.8/release level 8下编译,但是如果使用Java 11 JDK/runtime来执行它,那么java.class.version系统属性值仍然是55(Java11),尽管执行类的字节码级别是52(Java8)。
public class Java9Check{
    public static void main(String[] args){
        String bytecodeStr = System.getProperty("java.class.version");
        try {
            double bytecodeVal = Double.parseDouble(bytecodeStr);
            int bytecode = (int) bytecodeVal;
            // if Java 8 or below, return ExitCode(1)
            if (bytecode < 53) {
                System.out.println("Java8 or below");
                System.exit(1);
            }
            System.out.println("Java9 or above");
        } catch (NumberFormatException ignored) {}
        // proceed with normal exit, ExitCode(0)
    }
}

JDK Version  Class File Version
Java 1.0     45.0
Java 1.1     45.3
Java 1.2     46.0
Java 1.3     47.0
Java 1.4     48.0
Java 5       49.0
Java 6       50.0
Java 7       51.0
Java 8       52.0
Java 9       53.0
Java 10      54.0
Java 11      55.0
Java 12      56.0
Java 13      57.0
Java 14      58.0
Java 15      59.0
Java 16      60.0
Java 17      61.0
Java 18      62.0
Java 19      63.0
Java 20      64.0
Java 21      65.0
Java 22      66.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接