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

时间:2017-03-29 19:45:28

标签: java javac java-9

Java 9' catch (Exception) 有一个新标记javac

--release

它与> javac --help ... --release <release> Compile for a specific VM version. Supported targets: 6, 7, 8, 9 -source标志有何不同?它只是-target的快捷方式吗?

2 个答案:

答案 0 :(得分:65)

不完全是。

JEP 247: Compile for Older Platform Versions定义了这个新的命令行选项--release

  

我们定义了一个新的命令行选项--release,它自动配置编译器以生成将链接到给定平台版本的实现的类文件。对于javac中预定义的平台, --release N相当于-source N -target N -bootclasspath <bootclasspath-from-N> 。 (强调我的)

所以不,它不等同于-source N -target N。这种添加的原因在&#34; Motivation&#34;部分:

  

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

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

进一步阅读in the mailing listOracle Docs。原始错误已归档here。请注意,自从集成此选项以来,JDK构建已与旧版本的平台API的描述捆绑在一起,在&#34;风险和假设&#34;部分中提到。这意味着您不需要在您的计算机上安装旧版本以进行交叉编译。

答案 1 :(得分:14)

--release X不仅仅是-source X -target X的快捷方式,因为-source-target不足以安全地编译到旧版本。您还需要设置一个-bootclasspath标志,该标志必须与旧版本相对应(此标志经常被遗忘)。因此,在Java 9中,他们制作了一个--release标志,它可以替代三个标志:-source-target-bootclasspath

所以,这是编译到Java 1.7的一个例子:

javac --release 7 <source files>

请注意,您甚至不需要在计算机上安装JDK 7。 JDK 9已包含所需信息,以防止您意外链接到JDK 7中不存在的符号。