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