1. 概述
在本教程中,我们将了解Java 9 的新命令行选项–release.
–release N
*.*
-source
-target.
2. Need for——release
为了理解需要-release
在Java 9 之前,可以通过使用source
target
-source:
指定编译器接受的Java版本-target:
指定要生成的类文件的Java 版本
假设编译的程序使用在当前版本的平台(在我们的例子中是Java 8)中专门可用的API。在这种情况下,编译的程序不能在Java 7 等早期版本上运行,无论传递给–source
target
此外,我们需要添加–bootclasspath
source
target
为了简化这个交叉编译问题,Java 9 引入了新选项——release
3.关系随着-source
target
对于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 进行编译。换句话说,虽然我们提供的–source
target
因此,我们必须将另一个名为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
我们看到,release
javac
-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 评论