的Java 9的javac
有一个新的标志--release
:什么是Java 9编译器中的--release标志?
> javac --help
...
--release <release>
Compile for a specific VM version. Supported targets: 6, 7, 8, 9
它是如何从-source
和-target
标志有什么不同?它只是-source X -target X
的快捷方式吗?
的Java 9的javac
有一个新的标志--release
:什么是Java 9编译器中的--release标志?
> javac --help
...
--release <release>
Compile for a specific VM version. Supported targets: 6, 7, 8, 9
它是如何从-source
和-target
标志有什么不同?它只是-source X -target X
的快捷方式吗?
不完全。下面是对proposal的链接选项:
我们定义了一个新的命令行选项,
--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版本进行编译,并允许在旧版本上执行。由于它经常被人遗忘,因此决定增加一个命令行选项,它可以正确地交叉编译所有必需的东西。
进一步阅读in the mailing list和Oracle Docs。原始错误提交到here。请注意,自从整合了这个选项后,JDK版本就捆绑了旧版本平台API的描述,在“风险和假设”一节中提到。这意味着您不需要安装在机器上的旧版本就可以进行交叉编译。
--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中不存在的符号。