使用这些选项时要小心;我们曾经因为人们做出了一些假设而受到打击。
仅仅因为您使用了1.5的sourceCompatibility(或targetCompatibility),并不意味着您总是可以在JDK 1.6下编译您的代码,并期望它在JDK 1.5下工作。问题在于可用的库。
如果您的代码碰巧调用了JDK 1.6中才有的某个方法,即使使用了与目标VM相关的各种兼容性选项,它仍将编译。但是当您运行代码时,它会因为缺少该方法而失败(您将收到MethodNotFoundException或ClassNotFoundException)。
出于这个原因,我 总是 将Compatibility设置与实际正在构建的Java版本进行比较。如果它们不匹配,我就会让构建失败。
javac
选项--release
,旨在解决这个问题,只允许使用指定Java版本中可用的API。了解更多请参见https://dev59.com/RVgQ5IYBdhLWcg3wORZJ#43103038。 - James MuddsourceCompatibility = 指定编译.java文件所使用的Java编程语言版本。 例如 sourceCompatibility 1.6 = 指定使用Java编程语言版本1.6来编译.java文件。
默认情况下,sourceCompatibility =“当前JVM版本号”,targetCompatibility = sourceCompatibility
targetCompatibility = 此选项确保生成的类文件与由targetCompatibility指定的VM兼容。请注意,在大多数情况下,-target选项的值是-source选项的值;在这种情况下,您可以省略-target选项。
类文件将在targetCompatibility指定的目标上运行,以及更新版本,但不会在早期版本的VM上运行。
sourceCompatibility
和targetCompatibility
的好解释了,你可以在这里找到更多相关文章:Gradle: sourceCompatiblity vs targetCompatibility。但是,我建议使用Gradle的toolchain
(请参见JVM项目的工具链),这将使release
或sourceCompatibility
调整变得不再必要,并保证语言特性(sourceCompatibility
)、字节码(targetCompatibility
)和Java-API/-Libraries(release
)与Java版本匹配。(唯一的缺点是IDE支持尚未完全建立,但正在努力中)。release
或sourceCompatibility
调整过时”的参考资料:https://blog.gradle.org/java-toolchains。我花了一些时间才找到它。 - Shreck Ye这些是javac命令的标志。
javac [options] [sourcefiles]
Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...
源
版本中编写代码,并将类编译为目标
VM版本。这样,您就可以在其他工作站上运行它,即使那些工作站使用较旧的Java版本。