Java 源和目標選項指南
一、概述
在本教程中,我們將探索 Java source
的 -source 和target
選項。此外,我們將了解這些選項在 Java 8 中是如何工作的,以及它們是如何從 Java 9 開始演變而來的。
2. 與舊 Java 版本的向後兼容性
由於 Java 發布和更新頻繁,應用程序可能無法每次都遷移到較新的版本。應用程序有時需要確保其代碼向後兼容舊版本的 Java。 javac
中的target
和source
選項可以很容易地實現這一點。
要詳細了解這一點,首先,讓我們創建一個示例類並使用 Java 9 中添加但 Java 8 中不存在的List.of()
方法:
public class TestForSourceAndTarget {
public static void main(String[] args) {
System.out.println(List.of("Hello", "Baeldung"));
}
}
假設我們使用 Java 9 編譯代碼並希望與 Java 8 兼容。
我們可以使用-source
和-target
來實現這一點:
/jdk9path/bin/javac TestForSourceAndTarget.java -source 8 -target 8
現在,我們在編譯時收到警告,但編譯成功:
warning: [options] bootstrap class path not set in conjunction with -source 8
1 warning
讓我們用 Java 8 運行代碼,我們可以看到錯誤:
$ /jdk8path/bin/java TestForSourceAndTarget
Exception in thread "main" java.lang.NoSuchMethodError: ↩
java.util.List.of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
at com.baeldung.TestForSourceAndTarget.main(TestForSourceAndTarget.java:7)
在 Java 8 中, List.of()
不存在。理想情況下,Java 應該在編譯時拋出此錯誤。然而,在編譯過程中,我們只得到了一個警告。
讓我們看一下我們在編譯期間收到的警告。 javac
通知我們引導類不與source
8 結合使用。事實證明,我們必須提供引導類文件路徑,以便javac
可以選擇正確的文件進行交叉編譯。在我們的例子中,我們希望與 Java 8 兼容,但默認選擇 Java 9 引導類。
為此,我們必須使用Xbootclasspath
指向需要交叉編譯的 Java 版本的路徑:
/jdk9path/bin/javac TestForSourceAndTarget.java -source 8 -target 8 -Xbootclasspath ${jdk8path}/jre/lib/rt.jar
現在,讓我們編譯它,我們可以在編譯時看到錯誤:
TestForSourceAndTarget.java:7: error: cannot find symbol
System.out.println(List.of("Hello", "Baeldung"));
^
symbol: method of(String,
String)
location: interface List
1 error
3. 來源選項
--source 選項指定編譯器接受的 Java source
代碼版本:
/jdk9path/bin/javac TestForSourceAndTarget.java -source 8 -target 8
如果沒有-source
選項,編譯器將使用基於正在使用的 Java 版本的源代碼進行編譯。
在我們的示例中,如果 -source
8 未提供,編譯器將按照 Java 9 規範編譯源代碼。
-source
值 8 也意味著我們不能使用任何特定於 Java 9 的 API。為了使用 Java 9 中引入的任何 API,例如List.of() ,我們必須將 source 選項的值設置為 9 .
4. 目標選項
target 選項指定要生成的類文件的 Java 版本。目標版本必須等於或高於源選項:
/jdk9path/bin/javac TestForSourceAndTarget.java -source 8 -target 8
這裡, -- target
值 8 表示這將生成一個**需要 Java 8 或更高版本才能運行**的類文件。
如果我們在 Java 7 中運行上面的類文件,我們會得到一個錯誤。
5. Java 8 及更早版本中的源和目標
**從我們的示例中可以看出,要讓交叉編譯在 Java 8 之前正常工作,我們需要提供三個選項,即 - source, -target,
和-Xbootclasspath.
**例如,如果我們需要使用 Java 9 構建代碼,但它需要與 Java 8 兼容:
/jdk9path/bin/javac TestForSourceAndTarget.java -source 8 -target 8 -Xbootclasspath ${jdk8path}/jre/lib/rt.jar
從 JDK 8 開始,不推薦使用 1.5 或更早版本的源或目標,而在 JDK 9 中,完全刪除了對 1.5 或更早版本的源或目標的支持。
6. Java 9 及更高版本中的源和目標
儘管交叉編譯在 Java 8 中工作得很好,但三個命令行選項是必需的。當我們有三個選項時,很難讓它們都保持最新狀態。
作為 Java 9 的一部分,引入了release
選項以簡化交叉編譯過程。使用release
選項,我們可以完成和前面選項一樣的交叉編譯。
讓我們使用–release
選項來編譯我們之前的示例類:
/jdk9path/bin/javac TestForSourceAndTarget.java —release 8
TestForSourceAndTarget.java:7: error: cannot find symbol
System.out.println(List.of("Hello", "Baeldung"));
^
symbol: method of(String,String)
location: interface List
1 error
很明顯,編譯時只需要一個選項-release
,錯誤表明javac
在內部為-source, -target,
和-Xbootclasspath.
7. 結論
在本文中,我們了解了javac
的 -source 和target
選項以及它們與交叉source
的關係。此外,我們還發現了它們是如何在 Java 8 及更高版本中使用的。此外,我們還了解了 Java 9 中引入的-release
選項。