简短问题:如果我使用以前在Java 6中不可用的相对“次要”Java 7语言功能,例如try-muticatch块...这是否意味着我的程序将无法在具有JRE 6或JRE的计算机上运行5编译后安装为?如果这是正确的,是否可以快速生成JRE6 .jar可执行文件而无需更改Java 7源代码(顺便提一下,它将使用的唯一Java 7功能是try-multicatch块)?
答案 0 :(得分: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字节码,该字节码无法在< Java 7 JVM。如果您尝试这样做,您将收到一个错误,告诉您版本不匹配:
roach $ / Library / Java / Home / bin / java net.mostlyharmless.multicatch.App
线程“main”中的异常java.lang.UnsupportedClassVersionError: net / mostlyharmless / multicatch / App:不支持的major.minor版本 51.0
答案 1 :(得分: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