8

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

4

2 回答 2

8

你是对的。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标志)编译它,您将获得无法在 < Java 7 JVM 上运行的 Java 7 字节码。如果您尝试这样做,您将收到一条错误消息,告诉您版本不匹配:

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

于 2013-06-18T13:12:56.403 回答
7

您不能将具有 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 开始可用的方法

于 2013-06-18T12:11:18.773 回答