确定所有Java版本中的主要Java版本

Nic*_*lai 5 java java-9

在确定Java 8上的主要Java版本时,在使用系统属性之前java.specification.version,请删除1.并解析第二个数字:

  • 在Java 8上,这将产生"1.8"〜> "8"〜>8
  • 在Java 9上,相同的调用导致,NumberFormatException因为系统属性是"9"

什么是确定主要Java版本的面向未来的方法?我们的目标是获得一个int可以if-ed或switch-ed在决定采取哪些代码路径(例如在图书馆激活功能).

Nic*_*lai 6

Java 9引入了这个Runtime.Version类,希望在未来一段时间内得到支持.将它与我得到的旧方法配对:

public static int getMajorVersion() {
    try {
        // use Java 9+ version API via reflection, so it can be compiled for older versions
        Method runtime_version = Runtime.class.getMethod("version");
        Object version = runtime_version.invoke(null);
        Method version_major = runtime_version.getReturnType().getMethod("major");
        return (int) version_major.invoke(version);
    // do not catch `ReflectiveOperationException` because it does not exist in Java <7
    } catch (Exception ex) {
        // before Java 9 system property 'java.specification.version'
        // is of the form '1.major', so return the int after '1.'
        String versionString = System.getProperty("java.specification.version");
        return Integer.parseInt(versionString.substring(2));
    }
}
Run Code Online (Sandbox Code Playgroud)

(我在CC-0下发布此代码:您可以复制,修改,分发和执行工作,即使是出于商业目的,也可以不经许可.)

它适用于我的机器(哈哈),但我不确定这是否是最佳解决方案,因为我不知道新API或系统属性是否有任何我不知道的极端情况.

另请参阅Stephen的答案,为什么首先将版本减少到一位数可能不是一个好主意.

  • 您可以使用`runtime_version.getReturnType()`替换`Class.forName("java.lang.Runtime $ Version")`. (4认同)
  • @nullpointer:`ReflectiveOperationException`甚至需要Java 7.很容易忽略早期版本中没有的东西...... (3认同)

Ste*_*n C 5

显然,没有什么可以保证未来的证据.我们无法确定地预测未来(!)

但是,以下版本适用于以前版本的Java和符合JEP 233的版本:

  1. 如果版本字符串以"1. [0-4]"开头,则按原样使用.
  2. 如果版本字符串以"1. [5-8]"开头,则删除"1".
  3. 否则,请使用第一个"."之前的数字.

但是,您使用的编号版本也存在问题.例如,"Java 5"和"Java 1.5"意思相同.您使用哪种方法取决于您尝试使用命名方案满足的对象.

关于"官方"Java版本名称的一个好的(但不是确定的)参考:


请注意,您的原始方案会破坏早期Java版本,例如"1.2.1"和"1.3.1",其中最终数字很重要.并且您不希望开始将Java 1.0标记为"Java 0".最后,Java 1.0和Java 1.1非常不同,不应混淆.(Java 1.0没有嵌套/内部类,一开始.)


会这样做是为了制作一个"经理友好"的名字.为了"决策目的",我不会将版本缩减为单个数字.您可能会发现次要版本之间的差异很大.

  • 从"1.2"到"1.4"(包括)的Java版本,也标记为"Java 2". (4认同)
  • 我想,这有点复杂.这是一个重复的营销过程,试图提高主要数量和公司倒退,因为担心与应用程序和库进行天真的版本字符串比较的兼容性问题.完成1.2,再次使用1.5.然而,最糟糕的是他们从未设法在JRE中添加版本检查支持(直到Java 9),这可以轻松解决该问题...... (4认同)