拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java 9 编译器中的–release 选项是什么?

Java 9 编译器中的–release 选项是什么?

白鹭 - 2021-11-06 2199 0 2

1. 概述

在本教程中,我们将了解Java 9 的新命令行选项–release. –release N*.*-source-target.

2. Need for——release

为了理解需要-release

在Java 9 之前,可以通过使用sourcetarget

  • -source:指定编译器接受的Java版本

  • -target:指定要生成的类文件的Java 版本

假设编译的程序使用在当前版本的平台(在我们的例子中是Java 8)中专门可用的API。在这种情况下,编译的程序不能在Java 7 等早期版本上运行,无论传递给–sourcetarget

此外,我们需要添加–bootclasspathsourcetarget

为了简化这个交叉编译问题,Java 9 引入了新选项——release

3.关系随着-sourcetarget

根据–release

  • 对于N < 9,-source-target-bootclasspath

  • 对于N >= 9,-source-target–system

以下是有关这些内部选项的一些详细信息:

  • -bootclasspath:用于搜索引导类文件的目录、JAR 档案和ZIP 档案的分号分隔列表

  • system

此外,文档化的API 位于$JDK_ROOT/lib/ct.sym

对于Java 版本N<9,这些API 包括从位于jre/lib/rt.jar

对于Java 版本N >= 9,这些API 包括从位于jdkpath/jmods/

4. 命令行使用

首先,让我们创建一个示例类并使用Java 9 中添加的ByteBuffer flip()

import java.nio.ByteBuffer;
 public class TestForRelease {
 public static void main(String[] args) {
 ByteBuffer bb = ByteBuffer.allocate(16);
 bb.flip();
 System.out.println("Baeldung: --release option test is successful");
 }
 }

4.1.使用现有的-source 和-target 选项

-source-target

/jdk9path/bin/javac TestForRelease.java -source 8 -target 8

这样做的结果是成功的,但有一个警告:

warning: [options] bootstrap class path not set in conjunction with -source 8
 1 warning

现在,让我们在Java 8 上运行我们的代码:

/jdk8path/bin/java TestForRelease

我们看到这失败了:

Exception in thread "main" java.lang.NoSuchMethodError: java.nio.ByteBuffer.flip()Ljava/nio/ByteBuffer;
 at com.corejava.TestForRelease.main(TestForRelease.java:9)

正如我们所看到的,这不是我们在 所以虽然编译器应该考虑它,但事实并非如此。-target

让我们更详细地了解这一点。在编译期间,我们收到了之前忽略的警告。这是因为Java 编译器默认使用最新的API 进行编译。换句话说,虽然我们提供的–sourcetarget

因此,我们必须将另一个名为bootclasspath

现在,让我们使用–bootclasspath:

/jdk9path/bin/javac TestForRelease.java -source 8 -target 8 -Xbootclasspath ${jdk8path}/jre/lib/rt.jar

同样,这样做的结果是成功的,我们没有警告。

现在,让我们在Java 8 上运行我们的代码,我们看到这是成功的:

/jdk8path/bin/java TestForRelease
 Baeldung: --release option test is successful

尽管交叉编译现在可以工作,但我们必须提供三个命令行选项。

4.2.带–release 选项

现在,让我们使用–release

/jdk9path/bin/javac TestForRelease.java —-release 8

再次,这次编译成功,没有警告。

最后,当我们在Java 8 上运行代码时,我们看到它是成功的:

/jdk8path/bin/java TestForRelease
 Baeldung: --release option test is successful

我们看到,releasejavac-source, -target,bootclasspath.

5. 使用Maven Compiler Plugin

通常,我们使用Maven 或Gradle 等构建工具,而不是命令行 因此,在本节中,我们将看到如何在maven 编译器插件中javac–release

让我们首先看看我们如何使用现有的-source-target

<plugins>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <version>3.8.1</version>
 <configuration>
 <source>1.8</source>
 <target>1.8</target>
 </configuration>
 </plugin>
 </plugins>

以下是我们如何使用–release

<plugins>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-compiler-plugin</artifactId>
 <version>3.8.1</version>
 <configuration>
 <release>1.8</release>
 </configuration>
 </plugin>
 </plugins>

尽管行为与我们之前描述的相同,但我们将这些值传递给Java 编译器的方式是不同的。

六,结论

在本文中,我们了解了 然后,我们看到了如何在命令行和Maven 编译器插件中使用该选项。–release-source-target

最后,我们看到新的- 因此,建议尽可能使用它来代替release-target, -source,-bootclasspath.


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *