【问题标题】:java 7 language backwards compatibilityjava 7 语言向后兼容性
【发布时间】:2013-06-18 11:54:29
【问题描述】:

简短的问题:如果我使用 Java 6 中以前不可用的相对“次要”的 Java 7 语言功能,例如 try-muticatch 块...这是否意味着我的程序不会在具有 JRE 6 或 JRE 的机器上运行5 按原样编译后安装?如果这是正确的,有没有一种快速的方法可以在不更改 Java 7 源代码的情况下生成 JRE6 .jar 可执行文件(顺便说一下,它会使用的唯一 Java 7 功能是 try-multicatch 块)?

【问题讨论】:

    标签: java backwards-compatibility


    【解决方案1】:

    你是对的。 Multi-catch 是 Java 7 语言特性,无法将其编译为 Java 6(或更早版本)JVM 兼容字节码。

    使用 Java 7 编译器,以下允许您编译 Java 6 兼容字节码:

    javac -source 1.6 -target 1.6 MyJavaFile.java

    当您尝试编译 Java 7 语言功能(例如,multi-catch)时,您将获得:

    roach$ javac -source 1.6 -target 1.6 test.java
    warning: [options] bootstrap class path not set in conjunction with -source 1.6
    test.java:9: error: multi-catch statement is not supported in -source 1.6
        } catch (NullPointerException | BufferOverflowException ex) {}
                                      ^
      (use -source 7 or higher to enable multi-catch statement)
    1 error
    1 warning
    

    (有关warning 含义的更多信息,请参阅: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source - 与本次讨论无关)

    如果您将-source 标志更改为1.7,您将收到:

    源版本 1.7 需要目标版本 1.7

    因为...您无法将 Java 7 源代码(例如具有 Java 7 功能的源代码)编译为 Java 6 兼容字节码。

    如果您使用 Java 7 编译它(没有 -source 或 -target 标志),您将获得无法在

    roach$ /Library/Java/Home/bin/java net.mostlyharmless.multicatch.App
    线程“主”java.lang.UnsupportedClassVersionError 中的异常: net/mostlyharmless/multicatch/App : 不支持的 major.minor 版本 51.0

    【讨论】:

      【解决方案2】:

      你不能将带有 Java 7 特性的源代码编译成 Java 6 .class 因为这个

      javac -source 1.7 -target 1.6 Test.java
      

      产生source release 1.7 requires target release 1.7 错误。这是因为 1.7 的某些特性只能与 Java 7 类一起使用。例如 try-with-resources 使用 Throwable.addSuppressed 方法,仅从 1.7 开始提供

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-11
        • 2013-01-08
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多