Java 9的javac有一个新的标志——release:
>;javac——帮助
...
--发布<;发布>;
为特定VM版本编译。支持的目标:6、7、8、9
它与-source和-target标志有何不同?它只是-源X-目标X的快捷方式吗
不完全是
JEP 247:compileforolder Platform Versions定义了这个新的命令行选项,--release:
我们定义了一个新的命令行选项,
--release,它自动配置编译器以生成类文件,这些类文件将链接到给定平台版本的实现。对于javac中预定义的平台,--release N相当于-source N-target N-bootclasspath<;bootclasspath-from-N>。(强调矿山)
所以不,它并不等同于-source N-target N。增加的原因在“动机”一节中说明:
javac提供了两个命令行选项,-source和-target,可用于分别选择编译器接受的Java语言版本及其生成的类文件版本。但是,默认情况下,javac根据最新版本的平台API进行编译。因此,编译后的程序可能会意外地使用仅在平台当前版本中可用的API。无论传递给-source和-target的值如何,这些程序都不能在较旧版本的平台上运行。选项。这是一个长期的可用性难点,因为用户希望通过使用这些选项,他们将获得可以在指定平台版本上运行的类文件
简而言之,指定源和目标选项不足以进行交叉编译。因为默认情况下,javac是根据最新的平台API编译的,所以不能保证它们在旧版本上运行。您还需要指定与旧版本相对应的-bootclasspath选项才能正确交叉编译。这将包括要编译的正确API版本,并允许在旧版本上执行。因为它经常被遗忘,所以决定添加一个命令行选项,它完成了正确交叉编译所需的所有工作
进一步阅读邮件列表和Oracle文档。原来的bug是在这里归档的。请注意,自从集成了此选项之后,JDK构建与“风险和假设”一节中提到的较旧版本的平台API的描述捆绑在一起。这意味着您不需要在计算机上安装旧版本,就可以进行交叉编译