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 檔案」) 和包裝函式 shell 指令碼,其名稱與規則相同。包裝函式殼層指令碼會使用 classpath,其中包含每個二進位檔依附的程式庫的 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:包含來源檔案的封存檔案 (「source jar」)。
  • name_deploy.jar:適合部署的 Java 封存檔 (僅在明確要求時才會建構)。

    為規則建構 <name>_deploy.jar 目標時,會建立自包含 JAR 檔案,並附帶可透過 java -jar 指令或包裝函式指令碼的 --singlejar 選項的資訊清單。建議使用包裝函式指令碼,而非 java -jar,因為它也會傳遞 JVM 標記和載入原生程式庫的選項。

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

    如果目標指定啟動器屬性,則 _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 樹狀結構根目錄的資源清單。這個屬性唯一的用途,是支援第三方程式庫,這些程式庫要求其資源必須在 classpath 上以 "myconfig.xml" 的形式找到。由於命名空間衝突的風險,因此只允許在二進位檔上使用,而非程式庫。

create_executable

布林值;無法設定;預設值為 True

已淘汰,請改用 java_single_jar
deploy_env

標籤清單;預設為 []

其他 java_binary 目標清單,代表此二進位檔的部署環境。建構其他 java_binary 會載入的外掛程式時,請設定這項屬性。
設定這個屬性後,系統會排除這個二進位檔的執行階段類別路徑 (以及部署 JAR) 中的所有依附元件,這些依附元件是在這個二進位檔和 deploy_env 中指定的目標之間共用。
deploy_manifest_lines

字串清單;預設為 []

要新增至為 *_deploy.jar 目標產生的 META-INF/manifest.mf 檔案的程式碼行清單。此屬性內容不會受到「Make 變數」替換作業的影響。
javacopts

字串清單;預設為 []

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

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

jvm_flags

字串清單;預設為 []

要在產生用於執行此二進位檔的包裝函式指令碼時嵌入的標記清單。適用於 $(location)"Make 變數" 替換,以及 Bourne 殼層符記

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

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

launcher

標籤;預設為 None

指定用來執行 Java 程式的二進位檔,而非 JDK 隨附的一般 bin/java 程式。目標必須是 cc_binary。任何實作 Java 叫用 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

字串清單;不可設定;預設為 []

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

標籤清單;預設為 []

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

標籤清單 (必要)

提供給依賴此目標的 Java 目標的 JAR 檔案清單。

布林值;預設值為 False

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

標籤清單;預設為 []

用於 Proguard 規格的檔案。這些會說明 Proguard 要使用的一組規格。如果指定,系統會將這些項目新增至任何 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:包含來源檔案的封存檔案 (「source jar」)。

引數

屬性
name

名稱 (必填)

這個目標的專屬名稱。

deps

標籤清單;預設為 []

要連結至此程式庫的程式庫清單。如要查看 deps 的一般註解,請參閱「大多數建構規則定義的常見屬性」。

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

相反地,data 屬性中的目標會包含在執行檔中,但不會出現在編譯時間或執行階段的 classpath 中。

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 屬性,為資源檔案指定特定的替代目錄。

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

exported_plugins

標籤清單;預設為 []

匯出至直接依附於此程式庫的程式庫的 java_plugin (例如註解處理器) 清單。

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

exports

標籤清單;預設為 []

匯出的程式庫。

在此列出規則,即可讓父項規則使用這些規則,就像父項明確依附這些規則一樣。但對於一般 (未匯出的) deps 則不然。

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

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

所有直接上層規則都可以關閉匯出的程式庫。以下是另一個稍有不同的例子: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 語言規格說明書 (例如static final 常數 (String 或基本型別)。因此,建議的用途是當執行階段程式庫與編譯程式庫相同時。

如果執行階段程式庫與編譯程式庫不同,則您必須確保兩者僅在 JLS 禁止編譯器內嵌的部分有所差異 (且必須適用於所有未來的 JLS 版本)。

plugins

標籤清單;預設為 []

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

標籤清單;預設為 []

用於 Proguard 規格的檔案。這些會說明 Proguard 要使用的一組規格。如果指定,系統會將這些項目新增至任何 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 一樣,這些會顯示在執行階段類別路徑中,但與一般 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 樹狀結構根目錄的資源清單。這個屬性唯一的用途,是支援第三方程式庫,這些程式庫要求其資源必須在 classpath 上以 "myconfig.xml" 的形式找到。由於命名空間衝突的風險,因此只允許在二進位檔上使用,而非程式庫。

create_executable

布林值;無法設定;預設值為 True

已淘汰,請改用 java_single_jar
deploy_manifest_lines

字串清單;預設為 []

要新增至為 *_deploy.jar 目標產生的 META-INF/manifest.mf 檔案的程式碼行清單。此屬性內容不會受到「Make 變數」替換作業的影響。
javacopts

字串清單;預設為 []

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

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

jvm_flags

字串清單;預設為 []

要在產生用於執行此二進位檔的包裝函式指令碼時嵌入的標記清單。適用於 $(location)"Make 變數" 替換,以及 Bourne 殼層符記

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

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

launcher

標籤;預設為 None

指定用來執行 Java 程式的二進位檔,而非 JDK 隨附的一般 bin/java 程式。目標必須是 cc_binary。任何實作 Java 叫用 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

整數;預設值為 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 屬性中的目標會包含在執行檔中,但不會出現在編譯時間或執行階段的 classpath 中。

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

字串清單;預設為 []

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

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

布林值;預設值為 False

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

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

如果執行階段程式庫與編譯程式庫不同,則您必須確保兩者僅在 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 要使用的一組規格。如果指定,系統會將這些項目新增至任何 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

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_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 中可用於標籤展開的工具標籤。
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 目標引導路徑項目。對應至 javac 的 -bootclasspath 標記。
deps_checker

標籤清單;預設為 []

ImportDepsChecker 部署 JAR 的標籤。
forcibly_disable_header_compilation

布林值;預設值為 False

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

標籤清單 (必要)

GenClass 部署 JAR 的標籤。
header_compiler

標籤清單;預設為 []

標頭編譯器的標籤。如果已啟用 --java_header_compilation,則為必要選項。
header_compiler_direct

標籤清單;預設為 []

標頭編譯器的選用標籤,用於不包含任何 API 產生註解處理程序的直接路徑集動作。

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

ijar

標籤清單 (必要)

ijar 可執行檔的標籤。
jacocorunner

標籤;預設為 None

JacocoCoverageRunner 部署 JAR 的標籤。
java_runtime

標籤;必填

與此工具鍊搭配使用的 java_runtime。在執行設定中,預設為 java_runtime。
javabuilder

標籤清單 (必要)

JavaBuilder 部署 JAR 的標籤。
javabuilder_data

標籤清單;預設為 []

可在 javabuilder_jvm_opts 中用於標籤展開的資料標籤。
javabuilder_jvm_opts

字串清單;預設為 []

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

布林值;預設值為 True

如果 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 選項。