Java 規則

回報問題 查看原始碼 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

規則

java_binary

查看規則來源
java_binary(name, deps, srcs, data, resources, args, classpath_resources, compatible_with, create_executable, deploy_env, deploy_manifest_lines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, javacopts, jvm_flags, launcher, licenses, main_class, output_licenses, plugins, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, stamp, tags, target_compatible_with, testonly, toolchains, use_launcher, use_testrunner, visibility)

建構 Java 封存檔案 (「jar 檔案」),以及名稱與規則相同的包裝函式殼層指令碼。 包裝函式殼層指令碼會使用包含其他二進位檔的類別路徑,每個二進位檔依附於程式庫的 jar 檔案則包含在內。執行包裝函式殼層指令碼時,任何非空的 JAVABIN 環境變數都會優先採用透過 Bazel 的 --java_runtime_version 旗標指定的版本。

包裝函式指令碼可接受多個獨特的標記。如需包裝函式接受的設定可設定旗標和環境變數清單,請參閱 //src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt

隱含輸出目標

  • name.jar:Java 封存檔,內含與二進位檔直接依附元件相對應的類別檔案和其他資源。
  • name-src.jar:包含來源的封存檔 (「來源 jar」)。
  • name_deploy.jar:適合部署的 Java 封存檔 (只有在明確要求時才會建構)。

    為規則建構 <name>_deploy.jar 目標時,會建立自包含 JAR 檔案,並附帶資訊清單,讓您可以使用 java -jar 指令或包裝函式指令碼的 --singlejar 選項執行該檔案。建議使用包裝函式指令碼 (java -jar),因為這個指令碼也會傳遞 JVM 標記和載入原生資料庫的選項。

    部署 JAR 檔案包含所有類別,這些類別會由類別載入器找到,而該類別載入器會從頭到尾搜尋二進位檔的包裝函式指令碼中的 classpath。也包含依附元件所需的原生資料庫。這些類別會在執行階段自動載入至 JVM。

    如果您的目標指定「launcher」屬性,則 _deploy.jar 會是原生二進位檔,而不是一般 JAR 檔案。這個檔案包含啟動器,以及規則的所有原生 (C++) 依附元件,全部連結至靜態二進位檔。實際 jar 檔案的位元組會附加至該原生二進位檔,建立同時包含執行檔和 Java 程式碼的單一二進位 blob。您可以按照執行任何原生二進位檔的方式,直接執行產生的 jar 檔案。

  • name_deploy-src.jar:這個封存檔包含從目標遞移用途收集的來源。這些類別會與 deploy.jar 中的類別相符,除非 jar 沒有相符的來源 Jar。

在沒有 srcsjava_binary 規則中,不允許使用 deps 屬性;這類規則需要 runtime_deps 提供的 main_class

以下程式碼片段說明常見錯誤:

java_binary(
    name = "DontDoThis",
    srcs = [
        ...,
        "GeneratedJavaFile.java",  # a generated .java file
    ],
    deps = [":generating_rule",],  # rule that generates that file
)

建議改為執行以下動作:

java_binary(
    name = "DoThisInstead",
    srcs = [
        ...,
        ":generating_rule",
    ],
)

引數

屬性
name

名稱 (必填)

這個目標的專屬名稱。


建議您使用來源檔案的名稱,也就是應用程式的主要進入點 (減去副檔名)。舉例來說,如果進入點名稱為 Main.java,則名稱可以是 Main
deps

標籤清單;預設為 []

要連結至目標的其他程式庫清單。如要查看 deps 的一般註解,請參閱「大部分建構規則定義的常見屬性」。
srcs

標籤清單;預設值為 []

用於建立目標的來源檔案清單。這個屬性幾乎是必填項目,請參閱下方的例外狀況。

.java 類型的來源檔案已編譯。如果是產生的 .java 檔案,通常建議在此處輸入產生規則的名稱,而非檔案本身的名稱。這麼做不僅可以提高可讀性,也能使規則更能靈活因應日後的變更;如果產生規則將產生不同檔案,您只需要修正一個位置:產生規則的 outs。您不應在 deps 中列出產生規則,因為這是無操作。

系統會解壓縮並編譯 .srcjar 類型的來源檔案。(如果您需要使用 genrule 產生一組 .java 檔案,這項功能就非常實用。)

規則:如果規則 (通常為 genrulefilegroup) 產生上述任何檔案,則會以與來源檔案相同的方式使用這些檔案。

此引數幾乎一律是必要引數,除非 main_class 屬性在執行階段類別路徑中指定類別,或是您指定 runtime_deps 引數。

resources

標籤清單;預設值為 []

要加入 Java jar 的資料檔案清單。

如果有指定資源,系統會將這些資源與編譯產生的一般 .class 檔案一起封裝在 jar 中。jar 檔案內資源的位置取決於專案結構。Bazel 會先尋找 Maven 的標準目錄版面配置 (「src」目錄後面會接著一個「resources」目錄子系)。如果找不到,Bazel 會尋找名稱為「java」或「javatests」的頂層目錄 (舉例來說,如果資源位於 <workspace root>/x/java/y/java/z,資源路徑就會是 y/java/z)。這項經驗法則無法覆寫,不過 resource_strip_prefix 屬性可以用來為資源檔案指定特定額外目錄。

資源可以是來源檔案或產生的檔案。

classpath_resources

標籤清單;預設為 []

除非別無他法,否則請勿使用此選項

必須位於 Java 樹狀結構根目錄的資源清單。這項屬性的唯一用途是支援第三方程式庫,這類程式庫的資源必須在類別路徑 (即 "myconfig.xml") 中找到的資源。由於命名空間衝突的風險,因此只允許在二進位檔上使用,而非程式庫。

create_executable

布林值;nonconfigurable;預設值為 True

已淘汰,請改用 java_single_jar
deploy_env

標籤清單;預設為 []

其他 java_binary 目標清單,代表此二進位檔的部署環境。建構會由另一個 java_binary 載入的外掛程式時,請設定這項屬性。
設定這個屬性後,這個二進位檔與 deploy_env 中指定的目標會共用這個二進位檔的類別路徑 (以及部署 jar 檔案) 中的所有依附元件。
deploy_manifest_lines

字串清單;預設為 []

針對 *_deploy.jar 目標產生的 META-INF/manifest.mf 檔案,要加入的一系列程式碼。此屬性內容不會受到「Make 變數」替換作業的影響。
javacopts

字串清單;預設值為 []

這個程式庫的額外編譯器選項。取決於「建立變數」和「Bourne 殼層權杖化」作業。

這些編譯器選項會在全域編譯器選項之後傳遞至 javac。

jvm_flags

字串清單;預設為 []

要在產生用於執行此二進位檔的包裝函式指令碼時嵌入的標記清單。取決於 $(location)"MakeVariable" 替換,以及 Bourne 殼層權杖化

Java 二進位檔的包裝函式指令碼包含 CLASSPATH 定義 (用於找出所有相依的 jar 檔案),並叫用正確的 Java 解譯器。包裝函式指令碼產生的指令列包含主要類別的名稱,後面加上 "$@",因此您可以在類別名稱後方傳遞其他引數。不過,您必須將 JVM 要剖析的引數,在指令列的類別名稱「之前」指定。系統會在包裝函式指令碼中加上 jvm_flags 的內容,接著才列出類別名稱。

請注意,此屬性對 *_deploy.jar 輸出結果沒有影響

launcher

標籤;預設值為 None

指定用來執行 Java 程式的二進位檔,而非 JDK 隨附的一般 bin/java 程式。目標必須是 cc_binary。凡是實作 Java Invocation APIcc_binary,都能指定為這項屬性的值。

根據預設,Bazel 會使用一般 JDK 啟動器 (bin/java 或 java.exe)。

相關的 --java_launcher Bazel 標記只會影響那些指定 launcher 屬性的 java_binaryjava_test 目標。

請注意,原生 (C++、SWIG、JNI) 依附元件會根據您使用 JDK 啟動器或其他啟動器而有所不同:

  • 如果您使用的是一般 JDK 啟動器 (預設),原生依附元件會建構為名為 {name}_nativedeps.so 的共用程式庫,其中 {name} 是這個 java_binary 規則的 name 屬性。這項設定中的連結器「不會」移除未使用的程式碼。
  • 如果您使用任何其他啟動器,原生 (C++) 依附元件會靜態連結至名為 {name}_nativedeps 的二進位檔,其中 {name} 是這個 java_binary 規則的 name 屬性。在這種情況下,連結器會將認為未使用的程式碼從產生的二進位檔中移除,這表示除非 cc_library 目標指定 alwayslink = 1,否則不得連結任何僅透過 JNI 存取的 C++ 程式碼。

使用預設 JDK 啟動器以外的任何啟動器時,*_deploy.jar 輸出的格式會變更。詳情請參閱主要的 java_binary 說明文件。

main_class

字串;預設為 ""

包含 main() 方法的類別名稱,用於做為進入點。如果規則使用這個選項,就不需要 srcs=[...] 清單。因此,如果有這個屬性,即可透過已包含一或多個 main() 方法的 Java 程式庫執行執行檔。

此屬性的值是類別名稱,而不是來源檔案。類別必須在執行階段可用:可以透過此規則 (來自 srcs) 編譯,或由直接或間接依附元件 (透過 runtime_depsdeps) 提供。如果類別無法使用,二進位檔會在執行階段失敗;因為沒有建構時間檢查。

plugins

標籤清單;預設為 []

要在編譯時執行的 Java 編譯器外掛程式。每當建構此規則時,系統都會執行這個屬性中指定的每個 java_plugin。程式庫也可能從使用 exported_plugins 的依附元件繼承外掛程式。外掛程式產生的資源會納入這項規則產生的 jar 檔案。
resource_jars

標籤清單;預設值為 []

已淘汰:請改用 java_import 和 deps 或 runtime_deps。
resource_strip_prefix

字串;預設值為 ""

要從 Java 資源中移除的路徑前置字串。

如果指定,系統會從 resources 屬性中的每個檔案中移除這個路徑前置字串。不在這個目錄中的資源檔案會發生錯誤。如未指定 (預設值),系統會根據與來源檔案 Java 套件相同的邏輯決定資源檔案的路徑。舉例來說,stuff/java/foo/bar/a.txt 中的來源檔案會位於 foo/bar/a.txt

runtime_deps

標籤清單;預設為 []

僅可在執行階段提供給最終二進位檔或測試的程式庫。與一般 deps 一樣,這些會顯示在執行階段類別路徑中,但與一般 deps 不同的是,這些不會顯示在編譯時間類別路徑中。這裡應列出僅在執行階段需要的依附元件。依附元件分析工具應忽略同時出現在 runtime_depsdeps 中的目標。
stamp

整數;預設值為 -1

是否將建構資訊編碼至二進位檔。可能的值包括:
  • stamp = 1:一律將建構資訊刻印到二進位檔中,即使是在 --nostamp 版本中也是如此。請避免使用這項設定,因為這可能會導致二進位檔和任何依賴二進位檔的後續動作無法進行遠端快取。
  • stamp = 0:一律以常數值取代建構資訊。這可以提供良好的建構結果快取。
  • stamp = -1:版本資訊的嵌入方式由 --[no]stamp 標記控制。

除非其依附元件變更,否則系統「不會」重新建構加上時間戳記的二進位檔。

use_launcher

布林值;預設值為 True

二進位檔是否應使用自訂啟動器。

如果將這項屬性設為 false,系統會忽略這個目標的 launcher 屬性和相關的 --java_launcher 標記。

use_testrunner

布林值;預設值為 False

使用測試執行器 (預設為 com.google.testing.junit.runner.BazelTestRunner) 類別做為 Java 程式的主要進入點,並將測試類別提供給測試執行器,做為 bazel.test_suite 系統屬性的值。您可以使用此功能覆寫預設行為,也就是對 java_test 規則使用測試執行器,而不應將其用於 java_binary 規則。您不太可能會這麼做。其中一個用途是用於由其他規則叫用的 AllTest 規則 (例如在執行測試前設定資料庫)。AllTest 規則必須宣告為 java_binary,但仍應將測試執行器做為主要進入點。您可以使用 main_class 屬性覆寫測試執行器類別的名稱。

java_import

查看規則來源
java_import(name, deps, data, compatible_with, constraints, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, jars, licenses, neverlink, proguard_specs, restricted_to, runtime_deps, srcjar, tags, target_compatible_with, testonly, visibility)

這項規則允許使用預先編譯的 .jar 檔案做為 java_libraryjava_binary 規則的程式庫。

範例

    java_import(
        name = "maven_model",
        jars = [
            "maven_model/maven-aether-provider-3.2.3.jar",
            "maven_model/maven-model-3.2.3.jar",
            "maven_model/maven-model-builder-3.2.3.jar",
        ],
    )

引數

屬性
name

名稱;必填

這個目標的專屬名稱。

deps

標籤清單;預設為 []

要連結至目標的其他程式庫清單。請參閱 java_library.deps
constraints

字串清單;nonconfigurable;預設值為 []

對這項規則施加的額外限制,做為 Java 程式庫。
exports

標籤清單;預設為 []

可供此規則使用者存取的目標。請參閱 java_library.exports
jars

標籤清單 (必填)

提供給 Java 目標 (取決於這個目標) 的 JAR 檔案清單。

布林值;預設值為 False

請僅在編譯時使用此程式庫,而非在執行階段使用。如果執行階段環境會在執行期間提供程式庫,此選項就很實用。這類程式庫的例子包括 IDE 外掛程式的 IDE API,而在標準 JDK 上執行的任何項目則為 tools.jar
proguard_specs

標籤清單;預設為 []

用於 Proguard 規格的檔案。這些會說明 Proguard 要使用的一組規格。如果有指定,系統會根據這個程式庫,將這些 ID 新增至任何 android_binary 目標。此處所包含的檔案只能包含同質性規則,也就是 -dontnote、-dontwarn、assumenosideeffects,以及開頭為 -keep 的規則。其他選項只能顯示在 android_binary 的 proguard_specs 中,以確保非邏輯合併。
runtime_deps

標籤清單;預設值為 []

僅在執行階段提供給最終二進位檔或測試的程式庫。請參閱 java_library.runtime_deps
srcjar

標籤;預設為 None

含有已編譯 JAR 檔案原始碼的 JAR 檔案。

java_library

查看規則來源
java_library(name, deps, srcs, data, resources, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exported_plugins, exports, features, javacopts, licenses, neverlink, plugins, proguard_specs, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, tags, target_compatible_with, testonly, visibility)

這項規則會將來源編譯並連結至 .jar 檔案。

隱含輸出目標

  • libname.jar:包含類別檔案的 Java 封存檔。
  • libname-src.jar:包含來源的封存檔 (「來源 jar」)。

引數

屬性
name

名稱;必填

此目標的專屬名稱。

deps

標籤清單;預設為 []

要連結至此程式庫的程式庫清單。請參閱多數建構規則定義的一般屬性中有關 deps 的一般註解。

deps 所列 java_library 規則建構的 JAR 檔案,會位於此規則的編譯時間類別路徑。此外,其 depsruntime_depsexports 的遞移性關閉作業也會在執行階段類別路徑上。

相反地,data 屬性中的目標會包含在執行檔案中,但不包含編譯時間或執行階段類別路徑。

srcs

標籤清單;預設值為 []

用於建立目標的來源檔案清單。這項屬性通常為必要屬性,請參閱下方的例外狀況。

.java 類型的來源檔案已編譯。如果是產生的 .java 檔案,通常建議在此處輸入產生規則的名稱,而非檔案本身的名稱。這麼做不僅可以提高可讀性,也能使規則更能靈活因應日後的變更;如果產生規則將產生不同檔案,您只需要修正一個位置:產生規則的 outs。您不應在 deps 中列出產生規則,因為這是無操作。

系統會解壓縮並編譯 .srcjar 類型的來源檔案。(如果您需要使用 genrule 產生一組 .java 檔案,這項功能就非常實用。)

規則:如果規則 (通常為 genrulefilegroup) 產生上述任一檔案,系統就會以與來源檔案相同的方式使用這些檔案。

此引數幾乎一律是必要引數,除非 main_class 屬性在執行階段類別路徑中指定類別,或是您指定 runtime_deps 引數。

data

標籤清單;預設為 []

這個程式庫在執行階段所需的檔案清單。如要查看 data 的一般註解,請參閱「大多數建構規則定義的常見屬性」。

建構 java_library 時,Bazel 不會將這些檔案放在任何位置;如果 data 檔案是產生的檔案,則 Bazel 會產生這些檔案。建構依附此 java_library Bazel 的測試時,系統會將 data 檔案複製或連結至執行檔案區域。

resources

標籤清單;預設值為 []

要納入 Java jar 中的資料檔案清單。

如果指定資源,系統會將這些資源與編譯產生的一般 .class 檔案一起打包至 JAR 檔案中。jar 檔案內資源的位置是由專案結構決定。Bazel 會先尋找 Maven 的標準目錄版面配置 (「src」目錄後面會接著一個「resources」目錄子系)。如果找不到,Bazel 會尋找名稱為「java」或「javatests」的頂層目錄 (舉例來說,如果資源位於 <workspace root>/x/java/y/java/z,資源路徑會是 y/java/z)。這項推論無法覆寫,但您可以使用 resource_strip_prefix 屬性,為資源檔案指定特定的替代目錄。

資源可以是來源檔案或產生的檔案。

exported_plugins

標籤清單;預設為 []

要匯出至直接依附這個程式庫的程式庫的 java_plugin (例如註解處理工具) 清單。

指定的 java_plugin 清單會套用至直接依附這個程式庫的任何程式庫,就像該程式庫在 plugins 中明確宣告這些標籤一樣。

exports

標籤清單;預設為 []

已匯出的程式庫。

這裡列出的規則可讓父項規則使用,就像父項規則明確依附這些規則一樣。這不適用於一般 (未匯出) deps

摘要:如果兩個規則之間存在以 deps 邊緣開頭,後面接零個或多個 exports 邊緣的依附元件路徑,則規則 X 可以存取 Y 中的程式碼。以下舉例說明。

假設 A 依附於 BB 須依附於 C。在這種情況下,C 是 A 的轉換依附元件,因此變更 C 的來源並重新建構 A 時,系統會正確重新建構所有內容。不過,A 無法在 C 中使用類別。為了達到這個目的,A 必須在其 deps 中宣告 C,而 B 只要在 (B 的) exports 屬性中宣告 C,即可讓 A (以及可能依附 A 的任何項目) 更容易執行。

匯出的程式庫適用於所有直接父項規則。以稍微不同的例子來說明:A 依附 B,B 依附 C 和 D,且也會匯出 C 而非 D。這樣一來,A 可以存取 C,但無法存取 D。現在,如果 C 和 D 分別匯出了某些程式庫 (C' 和 D),A 只能存取 C',而 D 無法存取。

重要事項:匯出的規則不是一般依附元件。以上述範例為例,如果 B 匯出 C 並想使用 C,則必須在自己的 deps 中列出 C。

javacopts

字串清單;預設為 []

這個程式庫的額外編譯器選項。適用於「Make 變數」替換和 Bourne shell 符記化

在全域編譯器選項之後,這些編譯器選項會傳遞至 javac。

布林值;預設值為 False

這個程式庫是否應僅用於編譯,而非執行階段。如果執行階段環境會在執行期間提供程式庫,相當實用。這類程式庫的例子包括 IDE 外掛程式的 IDE API,而在標準 JDK 上執行的任何項目則為 tools.jar

請注意,neverlink = 1 不會阻止編譯器將此程式庫中的內容內嵌至依賴此程式庫的編譯目標中,這符合 Java 語言規格說明書 (例如String 或原始類型的 static final 常數)。因此,當執行階段程式庫與編譯程式庫相同時,建議用途。

如果執行階段程式庫與編譯程式庫不同,您必須確保該程式庫的差別只在於 JLS 禁止編譯器以內嵌方式嵌入,且必須保留所有日後的 JLS 版本。

plugins

標籤清單;預設值為 []

要在編譯時執行的 Java 編譯器外掛程式。每當建構此規則時,系統都會執行這個屬性中指定的每個 java_plugin。程式庫也可能會從使用 exported_plugins 的依附元件繼承外掛程式。外掛程式產生的資源會納入這項規則的產生 JAR 檔案。
proguard_specs

標籤清單;預設值為 []

要做為 Proguard 規格的檔案。 這些會說明 Proguard 要使用的一組規格。如果有指定,系統會根據這個程式庫,將這些 ID 新增至任何 android_binary 目標。此處所包含的檔案只能包含同質性規則,也就是 -dontnote、-dontwarn、assumenosideeffects,以及開頭為 -keep 的規則。其他選項只能顯示在 android_binary 的 proguard_specs 中,以確保非邏輯合併。
resource_jars

標籤清單;預設為 []

已淘汰:請改用 java_import 和 deps 或 runtime_deps。
resource_strip_prefix

字串;預設值為 ""

要從 Java 資源中移除的路徑前置字串。

如有指定,系統會從 resources 屬性中的每個檔案移除這個路徑前置字串。如果資源檔案不在這個目錄中,就會發生錯誤。如果未指定 (預設),系統會根據來源檔案的 Java 套件,以相同的邏輯決定資源檔案的路徑。舉例來說,stuff/java/foo/bar/a.txt 的來源檔案位於 foo/bar/a.txt

runtime_deps

標籤清單;預設值為 []

僅可在執行階段提供給最終二進位檔或測試的程式庫。與一般的 deps 相同,這些內容會顯示在執行階段的類別路徑中,但與編譯時間類別路徑不同。這裡應列出只有在執行階段需要的依附元件。依附元件分析工具應忽略同時顯示在 runtime_depsdeps 中的目標。

java_lite_proto_library

查看規則來源
java_lite_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

java_lite_proto_library 會從 .proto 檔案產生 Java 程式碼。

deps 必須指向 proto_library 規則。

範例:

java_library(
    name = "lib",
    deps = [":foo"],
)

java_lite_proto_library(
    name = "foo",
    deps = [":bar"],
)

proto_library(
    name = "bar",
)

引數

屬性
name

名稱 (必填)

此目標的專屬名稱。

deps

標籤清單;預設為 []

要產生 Java 程式碼的 proto_library 規則清單。

java_proto_library

查看規則來源
java_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

java_proto_library 會從 .proto 檔案產生 Java 程式碼。

deps 必須指向 proto_library 規則。

範例:

java_library(
    name = "lib",
    deps = [":foo_java_proto"],
)

java_proto_library(
    name = "foo_java_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

引數

屬性
name

名稱 (必填)

此目標的專屬名稱。

deps

標籤清單;預設值為 []

要產生 Java 程式碼的 proto_library 規則清單。

java_test

查看規則來源
java_test(name, deps, srcs, data, resources, args, classpath_resources, compatible_with, create_executable, deploy_manifest_lines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, launcher, licenses, local, main_class, plugins, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, use_testrunner, visibility)

java_test() 規則會編譯 Java 測試。測試是指包裝在測試程式碼中的二進位檔。系統會叫用測試執行器的主要方法,而非編譯的主要類別。

隱含輸出目標

  • name.jar:Java 封存檔案。
  • name_deploy.jar:適合部署的 Java 封存檔案。(只有在明確要求時才會建構)。詳情請參閱 java_binaryname_deploy.jar 輸出內容說明。

請參閱 java_binary() 引數一節。這項規則也支援所有測試規則 (*_test) 的所有通用屬性

範例

java_library(
    name = "tests",
    srcs = glob(["*.java"]),
    deps = [
        "//java/com/foo/base:testResources",
        "//java/com/foo/testing/util",
    ],
)

java_test(
    name = "AllTests",
    size = "small",
    runtime_deps = [
        ":tests",
        "//util/mysql",
    ],
)

引數

屬性
name

名稱 (必填)

這個目標的專屬名稱。

deps

標籤清單;預設為 []

要連結至目標的其他程式庫清單。如要查看 deps 的一般註解,請參閱「大部分建構規則定義的常見屬性」。
srcs

標籤清單;預設值為 []

用於建立目標的來源檔案清單。這項屬性通常為必要屬性,請參閱下方的例外狀況。

.java 類型的來源檔案已編譯。如果是產生的 .java 檔案,通常建議在此處輸入產生規則的名稱,而非檔案本身的名稱。這麼做不僅可以提高可讀性,也能使規則更能靈活因應日後的變更;如果產生規則將產生不同檔案,您只需要修正一個位置:產生規則的 outs。您不應在 deps 中列出產生規則,因為這是無操作。

系統會解壓縮並編譯 .srcjar 類型的來源檔案。(如果您需要使用 genrule 產生一組 .java 檔案,這項功能就非常實用。)

規則:如果規則 (通常為 genrulefilegroup) 產生上述任一檔案,系統就會以與來源檔案相同的方式使用這些檔案。

這個引數幾乎一律都是必要的,除非 main_class 屬性在執行階段的類別路徑中指定類別,或是您指定 runtime_deps 引數。

resources

標籤清單;預設值為 []

要納入 Java jar 中的資料檔案清單。

如果指定資源,系統會將這些資源與編譯產生的一般 .class 檔案一起打包至 JAR 檔案中。jar 檔案內資源的位置是由專案結構決定。Bazel 會先尋找 Maven 的標準目錄版面配置 (「src」目錄後面接著「resources」目錄的子目錄)。如果找不到,Bazel 會尋找名稱為「java」或「javatests」的頂層目錄 (舉例來說,如果資源位於 <workspace root>/x/java/y/java/z,資源路徑就會是 y/java/z)。這項經驗法則無法覆寫,不過 resource_strip_prefix 屬性可以用來為資源檔案指定特定的替代目錄。

資源可以是來源檔案或產生的檔案。

classpath_resources

標籤清單;預設為 []

除非別無他法,否則請勿使用此選項

必須位於 Java 樹狀結構根目錄的資源清單。這個屬性唯一的用途,是支援第三方程式庫,這些程式庫要求其資源必須以 "myconfig.xml" 的形式出現在類別路徑中。因為命名空間衝突可能會導致命名空間發生衝突,因此只能用於二進位檔,不適用於程式庫。

create_executable

布林值;nonconfigurable;預設值為 True

已淘汰,請改用 java_single_jar
deploy_manifest_lines

字串清單;預設為 []

要新增至為 *_deploy.jar 目標產生的 META-INF/manifest.mf 檔案的程式碼行清單。這項屬性的內容取決於「Make 變數」替換作業。
javacopts

字串清單;預設值為 []

此程式庫的額外編譯器選項。適用於「Make 變數」替換和 Bourne shell 符記化

這些編譯器選項會在全域編譯器選項之後傳遞至 javac。

jvm_flags

字串清單;預設為 []

要在產生用於執行此二進位檔的包裝函式指令碼時嵌入的標記清單。取決於 $(location)"MakeVariable" 替換,以及 Bourne 殼層權杖化

Java 二進位檔的包裝函式指令碼包含 CLASSPATH 定義 (用於尋找所有依附的 JAR),並叫用正確的 Java 轉譯器。包裝函式指令碼產生的指令列包含主要類別名稱,後面接著 "$@",因此您可以將其他引數傳遞至 classname 之後。不過,如果您想讓 JVM 剖析引數,則必須在命令列的類別名稱前面指定引數。jvm_flags 的內容會在列出 classname 之前新增至包裝函式指令碼。

請注意,此屬性對 *_deploy.jar 輸出內容沒有任何影響

launcher

標籤;預設值為 None

指定用來執行 Java 程式的二進位檔,而非 JDK 隨附的一般 bin/java 程式。目標必須是 cc_binary。凡是實作 Java Invocation APIcc_binary,都能指定為這項屬性的值。

根據預設,Bazel 會使用一般 JDK 啟動器 (bin/java 或 java.exe)。

相關的 --java_launcher Bazel 標記只會影響那些指定 launcher 屬性的 java_binaryjava_test 目標。

請注意,視您使用 JDK 啟動器或其他啟動器而定,原生 (C++、SWIG、JNI) 依附元件的建構方式會有所不同:

  • 如果您使用的是一般 JDK 啟動器 (預設),原生依附元件會建構為名為 {name}_nativedeps.so 的共用程式庫,其中 {name} 是這個 java_binary 規則的 name 屬性。這項設定中的連結器「不會」移除未使用的程式碼。
  • 如果您使用任何其他啟動器,原生 (C++) 依附元件會靜態連結至名為 {name}_nativedeps 的二進位檔,其中 {name} 是這個 java_binary 規則的 name 屬性。在這種情況下,連結器會將認為未使用的程式碼從產生的二進位檔中移除,這表示除非 cc_library 目標指定 alwayslink = 1,否則不得連結任何僅透過 JNI 存取的 C++ 程式碼。

使用預設 JDK 啟動器以外的任何啟動器時,*_deploy.jar 輸出的格式會變更。詳情請參閱主要的 java_binary 文件。

main_class

字串;預設為 ""

包含 main() 方法的類別名稱,用於做為進入點。如果規則使用這個選項,就不需要 srcs=[...] 清單。因此,如果有這個屬性,即可透過已包含一或多個 main() 方法的 Java 程式庫執行執行檔。

這個屬性的值是類別名稱,而非來源檔案。類別必須在執行階段可用:可以透過此規則 (來自 srcs) 編譯,或由直接或間接依附元件 (透過 runtime_depsdeps) 提供。如果類別無法使用,二進位檔會在執行階段失敗;因為沒有建構時間檢查。

plugins

標籤清單;預設為 []

要在編譯時執行的 Java 編譯器外掛程式。建立這項規則時,系統會執行這項屬性中指定的所有 java_plugin。程式庫也可能從使用 exported_plugins 的依附元件繼承外掛程式。外掛程式產生的資源會納入這項規則產生的 jar 檔案。
resource_jars

標籤清單;預設值為 []

已淘汰:請改用 java_import 和 deps 或 runtime_deps。
resource_strip_prefix

字串;預設值為 ""

要從 Java 資源中移除的路徑前置字串。

如有指定,系統會從 resources 屬性中的每個檔案移除這個路徑前置字串。如果資源檔案不在這個目錄中,就會發生錯誤。如果未指定 (預設),系統會根據來源檔案的 Java 套件,以相同的邏輯決定資源檔案路徑。舉例來說,stuff/java/foo/bar/a.txt 的來源檔案位於 foo/bar/a.txt

runtime_deps

標籤清單;預設為 []

僅供最終二進位檔或執行階段測試使用的程式庫。與一般的 deps 相同,這些內容會顯示在執行階段的類別路徑中,但與編譯時間類別路徑不同。這裡應列出僅在執行階段需要的依附元件。依附元件分析工具應忽略同時出現在 runtime_depsdeps 中的目標。
stamp

整數,預設值為 0

是否將建構資訊編碼為二進位檔。可能的值包括:
  • stamp = 1:一律將建構資訊刻印到二進位檔中,即使是在 --nostamp 版本中也是如此。建議避免使用這項設定,因為這可能會終止二進位檔的遠端快取,以及任何依賴這項設定的下游動作。
  • stamp = 0:一律使用常數值取代建構資訊。這可以提供良好的建構結果快取。
  • stamp = -1:嵌入建構資訊的嵌入作業是由 --[no]stamp 標記控管。

除非其依附元件變更,否則系統「不會」重新建構加上時間戳記的二進位檔。

test_class

字串;預設為 ""

測試執行器要載入的 Java 類別。

如未定義這個引數,系統預設會使用舊版模式,並改用測試引數。將 --nolegacy_bazel_java_test 標記設為不退回第一個引數。

這個屬性可指定要由此測試執行的 Java 類別名稱。這項設定很少需要設定。如果省略這個引數,系統會使用目標的 name 及其來源根相對路徑推論該引數。如果測試位於已知來源根目錄之外,如未設定 test_class,Bazel 就會回報錯誤。

對於 JUnit3,測試類別必須是 junit.framework.TestCase 的子類別,或是需要傳回 junit.framework.Test (或 Test 的子類別) 的公開靜態 suite() 方法。如果是 JUnit4,類別必須使用 org.junit.runner.RunWith 註解。

這個屬性可讓多個 java_test 規則共用相同的 Test (TestCaseTestSuite 等)。通常會將其他資訊傳遞至該屬性 (例如透過 jvm_flags=['-Dkey=value']),以便在每個情況下顯示不同的行為,例如執行不同的測試子集。這項屬性也可讓您使用 javatests 樹狀結構以外的 Java 測試。

use_launcher

布林值;預設值為 True

二進位檔是否應使用自訂啟動器。

如果將這項屬性設為 false,系統會忽略這個目標的 launcher 屬性和相關的 --java_launcher 標記。

use_testrunner

布林值;預設值為 True

使用測試執行器 (預設為 com.google.testing.junit.runner.BazelTestRunner) 類別做為 Java 程式的主要進入點,並將測試類別提供給測試執行器,做為 bazel.test_suite 系統屬性的值。您可以使用此功能覆寫預設行為,也就是對 java_test 規則使用測試執行器,而不應將其用於 java_binary 規則。您不太可能會這麼做。其中一個用途是用於由其他規則叫用的 AllTest 規則 (例如在執行測試前設定資料庫)。AllTest 規則必須宣告為 java_binary,但仍應使用測試執行程式做為主要進入點。您可以使用 main_class 屬性覆寫測試執行器類別的名稱。

java_package_configuration

查看規則來源
java_package_configuration(name, data, compatible_with, deprecation, distribs, features, javacopts, licenses, packages, restricted_to, tags, target_compatible_with, testonly, visibility)

要套用至一組套件的設定。您可以將設定新增至 java_toolchain.javacopts

範例:

java_package_configuration(
    name = "my_configuration",
    packages = [":my_packages"],
    javacopts = ["-Werror"],
)

package_group(
    name = "my_packages",
    packages = [
        "//com/my/project/...",
        "-//com/my/project/testing/...",
    ],
)

java_toolchain(
    ...,
    package_configuration = [
        ":my_configuration",
    ]
)

引數

屬性
name

名稱;必填

此目標的專屬名稱。

data

標籤清單;預設為 []

這個設定在執行階段所需的檔案清單。
javacopts

字串清單;預設值為 []

Java 編譯器標記。
packages

標籤清單;預設為 []

系統應套用的 package_group 組合。

java_plugin

查看規則來源
java_plugin(name, deps, srcs, data, resources, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, generates_api, javacopts, licenses, neverlink, output_licenses, plugins, processor_class, proguard_specs, resource_jars, resource_strip_prefix, restricted_to, tags, target_compatible_with, testonly, visibility)

java_plugin 會為 Bazel 執行的 Java 編譯器定義外掛程式。目前,唯一支援的插件類型是註解處理工具。java_libraryjava_binary 規則可透過 plugins 屬性根據外掛程式執行外掛程式。java_library 也可使用 exported_plugins,將外掛程式自動匯出至直接依附於程式庫的程式庫。

隱含輸出目標

  • libname.jar:Java 封存檔。

引數與 java_library 相同,但新增了 processor_class 引數。

引數

屬性
name

名稱;必填

此目標的專屬名稱。

deps

標籤清單;預設值為 []

要連結至此程式庫的程式庫清單。請參閱多數建構規則定義的一般屬性中有關 deps 的一般註解。

deps 所列 java_library 規則建構的 JAR 檔案,會位於此規則的編譯時間類別路徑。此外,其 depsruntime_depsexports 的傳遞閉包也會出現在執行階段的類別路徑中。

相反地,data 屬性中的目標會包含在執行檔案中,但不包含編譯時間或執行階段類別路徑。

srcs

標籤清單;預設值為 []

用於建立目標的來源檔案清單。這項屬性通常為必要屬性,請參閱下方的例外狀況。

.java 類型的來源檔案已編譯。如果是產生的 .java 檔案,通常建議在此處輸入產生規則的名稱,而非檔案本身的名稱。這麼做不僅可以提高可讀性,也能使規則更能靈活因應日後的變更;如果產生規則將產生不同檔案,您只需要修正一個位置:產生規則的 outs。您不應在 deps 中列出產生規則,因為這是無操作。

系統會解壓縮並編譯 .srcjar 類型的來源檔案。(如果您需要使用 genrule 產生一組 .java 檔案,這項功能就非常實用。)

規則:如果規則 (通常為 genrulefilegroup) 產生上述任何檔案,則會以與來源檔案相同的方式使用這些檔案。

此引數幾乎一律是必要引數,除非 main_class 屬性在執行階段類別路徑中指定類別,或是您指定 runtime_deps 引數。

data

標籤清單;預設為 []

這個程式庫在執行階段所需的檔案清單。如要查看 data 的一般註解,請參閱「大多數建構規則定義的常見屬性」。

建構 java_library 時,Bazel 不會將這些檔案放在任何位置;如果 data 檔案是由產生,Bazel 就會產生這些檔案。建構依附此 java_library 的測試時,Bazel 會將 data 檔案複製或連結至 runfiles 區域。

resources

標籤清單;預設值為 []

要納入 Java jar 中的資料檔案清單。

如果有指定資源,系統會將這些資源與編譯產生的一般 .class 檔案一起封裝在 jar 中。jar 檔案中的資源位置取決於專案結構。Bazel 會先尋找 Maven 的標準目錄版面配置 (「src」目錄後面接著「resources」目錄的子目錄)。如果找不到,Bazel 接著會尋找名為「java」或「javatests」的最頂層目錄 (舉例來說,如果資源位於 <workspace root>/x/java/y/java/z,資源路徑為 y/java/z)。這項分析法無法覆寫,但您可以使用 resource_strip_prefix 屬性,為資源檔案指定特定的替代目錄。

資源可以是來源檔案或產生的檔案。

generates_api

布林值;預設值為 False

這個屬性會標示產生 API 程式碼的註解處理工具。

如果規則使用 API 產生註解處理器,則只有在產生規則後排程編譯動作時,依附於該規則的其他規則才能參照產生的程式碼。這項屬性會指示 Bazel 在啟用 --java_header_compilation 時引入排程限制。

警告:這個屬性會影響建構效能,請僅在必要時使用。

javacopts

字串清單;預設值為 []

這個程式庫的額外編譯器選項。取決於「建立變數」和「Bourne 殼層權杖化」作業。

這些編譯器選項會在全域編譯器選項之後傳遞至 javac。

布林值;預設值為 False

這個程式庫是否應僅用於編譯,而非執行階段。如果執行階段環境會在執行期間提供程式庫,相當實用。這類程式庫的例子包括 IDE 外掛程式的 IDE API,而在標準 JDK 上執行的任何項目則為 tools.jar

請注意,neverlink = 1 不會阻止編譯器將此程式庫中的內容內嵌至依賴此程式庫的編譯目標中,這符合 Java 語言規格說明書 (例如String 或原始類型的 static final 常數)。因此,當執行階段程式庫與編譯程式庫相同時,建議用途。

如果執行階段程式庫與編譯程式庫不同,您必須確保該程式庫的差別只在於 JLS 禁止編譯器以內嵌方式嵌入,且必須保留所有日後的 JLS 版本。

output_licenses

授權類型,預設為 ["none"]

查看 common attributes
plugins

標籤清單;預設為 []

要在編譯時執行的 Java 編譯器外掛程式。每當建構此規則時,系統都會執行這個屬性中指定的每個 java_plugin。程式庫也可能會從使用 exported_plugins 的依附元件繼承外掛程式。外掛程式產生的資源會納入這項規則產生的 JAR 檔案。
processor_class

字串;預設為 ""

處理器類別是完全符合條件的類別類型,Java 編譯器應使用為註解處理工具的進入點。如未指定,這項規則就不會為 Java 編譯器的註解處理提供註解處理工具,但其執行階段類別路徑仍會納入編譯器的註解處理工具路徑。(這項功能主要供容易發生錯誤的外掛程式使用,這類外掛程式會使用 java.util.ServiceLoader 從註解處理工具路徑載入。)
proguard_specs

標籤清單;預設值為 []

要做為 Proguard 規格的檔案。 這些會說明 Proguard 要使用的一組規格。如果有指定,系統會根據這個程式庫,將這些 ID 新增至任何 android_binary 目標。這裡包含的檔案只能包含冪等規則、亦即 -dontnote、-dontwarn、假設,以及開頭為 -keep 的規則。其他選項只能顯示在 android_binary 的 proguard_specs 中,以便確保非自動合併。
resource_jars

標籤清單;預設值為 []

已淘汰:請改用 java_import 和 deps 或 runtime_deps。
resource_strip_prefix

字串;預設值為 ""

要從 Java 資源中移除的路徑前置字串。

如果指定,系統會從 resources 屬性中的每個檔案中移除這個路徑前置字串。如果資源檔案不在這個目錄中,就會發生錯誤。如未指定 (預設值),系統會根據與來源檔案 Java 套件相同的邏輯決定資源檔案的路徑。舉例來說,stuff/java/foo/bar/a.txt 中的來源檔案會位於 foo/bar/a.txt

java_runtime

查看規則來源
java_runtime(name, srcs, compatible_with, default_cds, deprecation, distribs, features, hermetic_srcs, java, java_home, lib_ct_sym, lib_modules, licenses, restricted_to, tags, target_compatible_with, testonly, version, visibility)

指定 Java 執行階段的設定。

範例:

java_runtime(
    name = "jdk-9-ea+153",
    srcs = glob(["jdk9-ea+153/**"]),
    java_home = "jdk9-ea+153",
)

引數

屬性
name

名稱;必填

此目標的專屬名稱。

srcs

標籤清單;預設為 []

執行階段中的所有檔案。
default_cds

標籤;預設值為 None

密封 java_runtime 的預設 CDS 封存檔。當 java_binary 目標啟用隱密,且目標未提供 classlist 屬性來提供自己的 CDS 封存時,java_runtime 預設 CDS 會封裝在密封的部署 JAR 中。
hermetic_srcs

標籤清單;預設值為 []

執行階段中,執行密封部署所需的檔案。
java

標籤;預設值為 None

Java 執行檔的路徑。
java_home

字串;預設值為 ""

執行階段根目錄的路徑。適用於 "Make" 變數替換。 如果這個路徑是絕對路徑,則規則會表示非密封的 Java 執行階段,且有已知路徑。在這種情況下,srcsjava 屬性必須留空。
lib_ct_sym

標籤;預設值為 None

使用 --release 編譯時所需的 lib/ct.sym 檔案。如果未指定,且 srcs 中只有一個路徑結尾為 /lib/ct.sym 的檔案,系統會使用該檔案。
lib_modules

標籤;預設為 None

密封部署作業所需的 lib/modules 檔案。
version

整數;預設值為 0

Java 執行階段的功能版本。也就是 Runtime.version().feature() 傳回的整數。

java_toolchain

查看規則來源
java_toolchain(name, android_lint_data, android_lint_jvm_opts, android_lint_opts, android_lint_package_configuration, android_lint_runner, bootclasspath, compatible_with, deprecation, deps_checker, distribs, features, forcibly_disable_header_compilation, genclass, header_compiler, header_compiler_direct, ijar, jacocorunner, java_runtime, javabuilder, javabuilder_data, javabuilder_jvm_opts, javac_supports_multiplex_workers, javac_supports_worker_multiplex_sandboxing, javac_supports_workers, javacopts, jvm_opts, licenses, oneversion, oneversion_allowlist_for_tests, oneversion_whitelist, package_configuration, proguard_allowlister, resourcejar, restricted_to, singlejar, source_version, tags, target_compatible_with, target_version, testonly, timezone_data, tools, turbine_data, turbine_jvm_opts, visibility, xlint)

指定 Java 編譯器的設定。哪一個工具鍊可以透過 --java_toolchain 引數變更。通常除非需要調整 Java 編譯器,否則通常不應編寫這些類型的規則。

範例

簡單的範例如下:

java_toolchain(
    name = "toolchain",
    source_version = "7",
    target_version = "7",
    bootclasspath = ["//tools/jdk:bootclasspath"],
    xlint = [ "classfile", "divzero", "empty", "options", "path" ],
    javacopts = [ "-g" ],
    javabuilder = ":JavaBuilder_deploy.jar",
)

引數

屬性
name

名稱 (必填)

這個目標的專屬名稱。

android_lint_data

標籤清單;預設為 []

android_lint_jvm_opts 中可用於 label-expansion 的工具標籤。
android_lint_jvm_opts

字串清單;預設值為 []

叫用 Android Lint 時,JVM 的引數清單。
android_lint_opts

字串清單;預設為 []

Android Lint 引數清單。
android_lint_package_configuration

標籤清單;預設為 []

應套用至指定套件群組的 Android Lint 設定。
android_lint_runner

標籤;預設為 None

Android Lint 執行程式的標籤 (如果有的話)。
bootclasspath

標籤清單;預設值為 []

Java 目標 bootclasspath 項目。對應至 javac 的 -bootclasspath 標記。
deps_checker

標籤清單;預設值為 []

ImportDepsChecker 部署 jar 的標籤。
forcibly_disable_header_compilation

布林值;預設值為 False

覆寫 --java_header_compilation,在不支援標頭編譯的平台上停用標頭編譯,例如 JDK 7 Bazel。
genclass

標籤清單 (必填)

GenClass 部署 JAR 的標籤。
header_compiler

標籤清單;預設為 []

標頭編譯器的標籤。如果已啟用 --java_header_compile,則為必要欄位。
header_compiler_direct

標籤清單;預設值為 []

標頭編譯器的選用標籤,用於直接類別路徑動作 (不含任何 API 產生註解處理工具)。

這項工具不支援註解處理功能。

ijar

標籤清單 (必填)

ijar 可執行檔的標籤。
jacocorunner

標籤;預設為 None

JacocoCoverageRunner 部署 jar 的標籤。
java_runtime

標籤;必填

要與這個工具鍊搭配使用的 java_runtime。預設為執行設定中的 java_runtime。
javabuilder

標籤清單 (必填)

JavaBuilder 部署 JAR 的標籤。
javabuilder_data

標籤清單;預設為 []

javabuilder_jvm_opts 中可用於 label-expansion 的資料標籤。
javabuilder_jvm_opts

字串清單;預設值為 []

叫用 JavaBuilder 時 JVM 的引數清單。
javac_supports_multiplex_workers

布林值;預設值為 True

如果 JavaBuilder 支援做為多工持續工作站執行,則為 true,否則為 false。
javac_supports_worker_multiplex_sandboxing

布林值;預設值為 False

如果 JavaBuilder 支援多重沙箱,則為 True;如果不支援,則為 False。
javac_supports_workers

布林值;預設值為 True

如果 JavaBuilder 支援以持續性工作站執行,則為 True;如果不支援,則為 False。
javacopts

字串清單;預設值為 []

Java 編譯器的額外引數清單。如需可能的 Java 編譯器旗標完整清單,請參閱 Java 編譯器說明文件。
jvm_opts

字串清單;預設為 []

叫用 Java 編譯器時 JVM 的引數清單。如需這個選項的完整可用標記清單,請參閱 Java 虛擬機器說明文件。
oneversion

標籤;預設為 None

單一版本強制執行二進位檔的標籤。
oneversion_allowlist_for_tests

標籤;預設值為 None

測試單一版本許可清單的標籤。
oneversion_whitelist

標籤;預設值為 None

單一版本白名單的標籤。
package_configuration

標籤清單;預設值為 []

應套用至指定套件群組的設定。
proguard_allowlister

標籤;預設為 "@bazel_tools//tools/jdk:proguard_whitelister"

Proguard 許可清單工具的標籤。
resourcejar

標籤清單;預設值為 []

資源 JAR 建構工具可執行檔的標籤。
singlejar

標籤清單 (必要)

SingleJar 部署 JAR 的標籤。
source_version

字串;預設為 ""

Java 原始碼版本 (例如「6」或「7」)。它會指定 Java 原始碼中允許的程式碼結構組合。
target_version

字串;預設值為 ""

Java 目標版本 (例如「6」或「7」)。會指定應建構該類別的 Java 執行階段。
timezone_data

標籤;預設值為 None

含有時區資料的資源 Jar 標籤。如果已設定,系統會新增時區資料,做為所有 java_binary 規則的隱含依附元件。
tools

標籤清單;預設值為 []

可在 jvm_opts 中用於標籤展開的工具標籤。
turbine_data

標籤清單;預設值為 []

可在 turbine_jvm_opts 中使用 label-expansion 的資料標籤。
turbine_jvm_opts

字串清單;預設為 []

叫用 Turbine 時 JVM 的引數清單。
xlint

字串清單;預設為 []

要新增或移除預設清單中的警告清單。前面加上破折號即可移除。如需更多資訊,請參閱 Javac 說明文件中的 -Xlint 選項。