Java 9编译器中的–release标志是什么?

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&gt。(强调矿山)

所以不,它并不等同于-source N-target N。增加的原因在“动机”一节中说明:

javac提供了两个命令行选项,-source-target,可用于分别选择编译器接受的Java语言版本及其生成的类文件版本。但是,默认情况下,javac根据最新版本的平台API进行编译。因此,编译后的程序可能会意外地使用仅在平台当前版本中可用的API。无论传递给-source-target的值如何,这些程序都不能在较旧版本的平台上运行。选项。这是一个长期的可用性难点,因为用户希望通过使用这些选项,他们将获得可以在指定平台版本上运行的类文件

简而言之,指定源和目标选项不足以进行交叉编译。因为默认情况下,javac是根据最新的平台API编译的,所以不能保证它们在旧版本上运行。您还需要指定与旧版本相对应的-bootclasspath选项才能正确交叉编译。这将包括要编译的正确API版本,并允许在旧版本上执行。因为它经常被遗忘,所以决定添加一个命令行选项,它完成了正确交叉编译所需的所有工作

进一步阅读邮件列表和Oracle文档。原来的bug是在这里归档的。请注意,自从集成了此选项之后,JDK构建与“风险和假设”一节中提到的较旧版本的平台API的描述捆绑在一起。这意味着您不需要在计算机上安装旧版本,就可以进行交叉编译

发表评论