Answers:
使用时要小心;我们被人们的假设所困扰。
仅仅因为您使用1.5的sourceCompability(或targetCompatibility),并不意味着您可以始终使用JDK 1.6编译代码并期望它在JDK 1.5下工作。问题是可用的库。
如果您的代码碰巧调用了某些仅在JDK 1.6中可用的方法,它将仍然使用目标VM的各种Compatibility选项进行编译。但是,当您运行它时,它将失败,因为不存在有问题的方法(您将获得MethodNotFoundException或ClassNotFoundException)。
因此,我总是将Compatibility设置与要构建的实际Java版本进行比较。如果不匹配,我将使构建失败。
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())
这就是我在build.gradle文件开头立即解决此问题的方法。
javac
选项--release
旨在通过仅允许使用指定Java版本中可用的API来解决此问题。有关更多信息,请参见stackoverflow.com/a/43103038/4653517
sourceCompatibility =指定使用Java编程语言的版本来编译.java文件。例如sourceCompatibility 1.6 =指定将Java编程语言的1.6版用于编译.java文件。
默认情况下,sourceCompatibility =“正在使用的当前JVM的版本”,而targetCompatibility = sourceCompatibility
targetCompatibility =该选项可确保生成的类文件将与targetCompatibility指定的VM兼容。注意,在大多数情况下,-target选项的值是-source选项的值;在这种情况下,您可以省略-target选项。
类文件将在targetCompatibility指定的目标上以及更高版本上运行,但不会在VM的早期版本上运行
这些是javac命令的标志。
javac [options] [sourcefiles]
Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...
换句话说:您编写了一个source
版本的代码,并将您的类编译为target
VM版本。为了使其运行,例如,在具有较旧Java版本的其他工作站上运行。
根据:https : //docs.oracle.com/en/java/javase/11/tools/javac.html