Java 規則

規則

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 指令碼。 包裝函式殼層指令碼會使用包含其他項目的類別路徑,每個路徑都有一個 jar 檔案 程式庫的運作原理

包裝函式指令碼接受數個不重複的標記。詳情請參閱 //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 如果有需要 SQL 指令的分析工作負載 則 BigQuery 可能是最佳選擇建議使用包裝函式指令碼,因為 java -jar 這個指令碼 也會傳遞 JVM 旗標和選項 載入原生資料庫

    部署 jar 包含類別載入器可存取的所有類別 從二進位的包裝函式指令碼開始到頭搜尋類別路徑。此外, 包含依附元件所需的原生資料庫系統會自動載入 傳送至 JVM

    如果您的目標指定啟動器 屬性,_deploy.jar 不會做為一般 JAR 檔案,而是 原生二進位檔案。其中包含啟動器,以及 全部連結至一個靜態二進位檔案實際 jar 檔案的位元組會是 附加至該原生二進位檔,建立單一二進位 blob,其中含有 執行 和 Java 程式碼您可以直接執行產生的 jar 檔案 就像執行任何原生二進位檔

  • name_deploy-src.jar:包含來源的封存檔 持續收集訓練資料。這些將會與 deploy.jar (其中 jar 沒有相符的來源 jar 除外)。

只要沒有屬性,java_binary 規則中不得使用 deps 屬性 srcs;這種規則需要 main_class,提供者: runtime_deps

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

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

Name; required

此目標的專屬名稱。


建議您使用來源檔案名稱做為來源檔案的主要進入點 減去副檔名。例如,如果呼叫的進入點 Main.java,那麼您的姓名可能是Main
deps

List of labels; optional

要連結至目標的其他程式庫清單。 查看關於「deps」的一般評論: 大部分的建構規則
srcs

List of labels; optional

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

.java 類型的來源檔案已編譯。如果是 通常建議為 .java 檔案輸入產生規則的名稱 而不是檔案名稱這不僅可以提高可讀性 可讓規則較彈性地因應日後的變更:如果產生規則 日後只要修正以下位置即可:outs 產生的規則。請勿在 deps 中列出產生規則 因為這是免人工管理

.srcjar 類型的來源檔案未封裝及編譯。(如果您需要 您必須使用 Genrule 產生一組 .java 檔案)。

規則:如果規則 (通常為 genrulefilegroup) 產生 以上任何檔案,我們會依照來源說明的方式使用這些檔案 檔案。

此引數幾乎都是必要引數,除非 main_class 屬性會指定 類別,或是指定 runtime_deps 引數。

resources

List of labels; optional

要包含在 Java jar 中的資料檔案清單。

如有指定資源,這些資源會與常見程式語言一起封裝在 jar 檔案中 編譯產生的 .class 檔案。資源內部的資源位置 取決於專案結構Bazel 首先會搜尋 Maven 標準目錄版面配置 (「src」目錄後面加上「resources」目錄外) 的目錄。如果沒有 Bazel 會接著尋找最頂端的「java」目錄或「javatests」(因此, 例如,如果資源位於 <workspace root>/x/java/y/java/z, 資源路徑會是 y/java/z。這項經驗法則無法覆寫 不過,resource_strip_prefix 屬性可用來指定 資源檔案專用的替代目錄

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

classpath_resources

List of labels; optional

除非採用其他做法,否則請勿使用這個方式)

必須位於 Java 樹狀結構根目錄的資源清單。此屬性的 僅限於支援要求所屬資源 在類別路徑上找到與 "myconfig.xml" 完全相同。僅允許以下裝置使用: 可能會引發命名空間衝突的危險,而非程式庫。

create_executable

Boolean; optional; nonconfigurable; default is True

二進位檔是否為可執行檔。不可執行的二進位檔集體收集 轉換為部署 jar 檔案,但無法直接執行 如果設定這項屬性,則不會建立任何包裝函式指令碼。設定錯誤 如果 launchermain_class 屬性,則為 0 是否有設定。
deploy_env

List of labels; optional

代表部署作業的其他 java_binary 目標清單 為此二進位環境準備了 建構會由另一個程式載入的外掛程式時,請設定這項屬性 java_binary
設定此屬性會排除以下項目的所有依附元件: 這個二進位檔的執行階段類別路徑 (以及部署 jar 檔案) 會在 二進位檔和 deploy_env 中指定的目標。
deploy_manifest_lines

List of strings; optional

為資料集產生的 META-INF/manifest.mf 檔案要加入的各行清單 *_deploy.jar目標。這項屬性的內容「並非」主旨 「設為變數」
javacopts

List of strings; optional

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

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

jvm_flags

List of strings; optional

為執行此二進位檔而產生的包裝函式指令碼,要嵌入的標記清單。 須遵守 $(location) 和 「設為變數」替代,以及 Bourne 殼層權杖化

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

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

launcher

Label; optional

指定將用於執行 Java 程式的二進位檔,而非 JDK 隨附的一般 bin/java 程式。 目標必須是 cc_binary。任何符合以下條件的 cc_binary 會實作 可以將 Java Invocation API 指定為這個屬性的值。

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

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

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

  • 如果您使用一般 JDK 啟動器 (預設),原生依附元件就會 以名為 {name}_nativedeps.so 的共用資料庫建立,其中 {name} 是這項 java_binary 規則的 name 屬性。 這項設定中的連結器「不會」移除未使用的程式碼。
  • 如果您使用任何其他啟動器,原生 (C++) 依附元件會保持靜態 會連結至名為 {name}_nativedeps 的二進位檔,其中 {name} 是此 java_binary 規則的 name 屬性。在本例中 連結器會移除產生的二進位檔中未使用的程式碼 也就是說,除非使用者只透過 JNI 存取 C++ 程式碼,除非 cc_library 目標指定 alwayslink = 1

使用預設 JDK 啟動器以外的任何啟動器時,系統會將其格式 的 *_deploy.jar 輸出值會變更。查看主要 java_binary 文件。

main_class

String; optional

具有 main() 方法的類別名稱,用於做為進入點。 如果規則使用這個選項,則不需要 srcs=[...] 清單。 因此,有了這個屬性,使用者 包含一或多個 main() 方法。

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

plugins

List of labels; optional

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

List of labels; optional

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

String; optional

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

如果有指定,系統會從 resources 中的每個檔案移除這個路徑前置字串 屬性。將資源檔案不在這個目錄下會產生錯誤。如果不是 指定 (預設值) 時,系統會根據相同的 視為來源檔案的 Java 套件。例如,位於 stuff/java/foo/bar/a.txt 位於 foo/bar/a.txt

runtime_deps

List of labels; optional

僅可在執行階段提供給最終二進位檔或測試的程式庫。 與一般的 deps 相同,這些項目會顯示在執行階段的類別路徑中,但與一般的 deps 不同 而非編譯時間類別路徑應該只有執行階段所需的依附元件 這裡列出的條件依附元件分析工具應忽略同時顯示在兩者中的目標 《runtime_deps》和《deps》。
stamp

Integer; optional; default is -1

是否將建構資訊編碼為二進位檔。可能的值包括:
  • stamp = 1:一律在二進位檔中加上建構資訊加上戳記,即使在 --nostamp 版本。本 建議避免設定,因為這可能會終止 以及任何相依的下游動作
  • stamp = 0:一律以常數值取代建構資訊。這個 也提供良好的建構結果快取功能
  • stamp = -1:建構資訊的嵌入功能是由 --[no]stamp 旗標。

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

use_launcher

Boolean; optional; default is True

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

如果此屬性設為 false, launcher 屬性和相關的 --java_launcher 標記 將忽略此目標。

use_testrunner

Boolean; optional; default is 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

Name; required

此目標的專屬名稱。

deps

List of labels; optional

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

List of strings; optional; nonconfigurable

這項規則以 Java 程式庫的形式額外套用的限制。
exports

List of labels; optional

要提供給這項規則的使用者使用的目標。 請參閱 java_library.exports
jars

List of labels; required

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

Boolean; optional; default is False

這個程式庫只用於編譯,不會在執行階段使用。 如果執行階段環境會提供程式庫,就相當實用 執行狀態這類程式庫的範例為 IDE API IDE 外掛程式,而 tools.jar 則適用於執行 以及標準 JDK
proguard_specs

List of labels; optional

要做為 Proguard 規格的檔案。 這些設定會說明 Proguard 使用的規格。如果有指定的話 系統會根據這個程式庫,將這些群組加進任何 android_binary 目標。 這裡包含的檔案只能包含冪等規則,例如 -dontnote、-dontwarn、 以及以 -keep 開頭的規則。其他選項只能在 android_binary 的 proguard_specs 確保非自動合併。
runtime_deps

List of labels; optional

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

Label; optional

含有已編譯 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

Name; required

此目標的專屬名稱。

deps

List of labels; optional

連結至這個程式庫的程式庫清單。 查看關於「deps」的一般評論: 大部分的建構規則

由「deps」所列的 java_library 規則所建立的罐子將會啟動 這個規則的編譯時間類別路徑此外,資料中心的遞移性關閉 depsruntime_depsexports將於以下位置進入: 執行執行階段類別路徑

相反地,data 屬性中的目標會包含在執行檔案中, 不會在 compile-time 或執行階段類別路徑上

srcs

List of labels; optional

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

.java 類型的來源檔案已編譯。如果是 通常建議為 .java 檔案輸入產生規則的名稱 而不是檔案名稱這不僅可以提高可讀性 可讓規則較彈性地因應日後的變更:如果產生規則 日後只要修正以下位置即可:outs 產生的規則。請勿在 deps 中列出產生規則 因為這是免人工管理

.srcjar 類型的來源檔案未封裝及編譯。(如果您需要 您必須使用 Genrule 產生一組 .java 檔案)。

規則:如果規則 (通常為 genrulefilegroup) 產生 以上任何檔案,我們會依照來源說明的方式使用這些檔案 檔案。

此引數幾乎都是必要引數,除非 main_class 屬性會指定 類別,或是指定 runtime_deps 引數。

data

List of labels; optional

這個程式庫在執行階段所需的檔案清單。 查看關於「data」的一般評論: 大部分的建構規則

建構 java_library 時,Bazel 不會將這些檔案存放在任何位置;如果 系統會產生 data 檔案,然後由 Bazel 產生這些檔案。建立容器時 仰賴此 java_library Bazel 複製或連結 data 檔案進入執行檔案區域。

resources

List of labels; optional

要包含在 Java jar 中的資料檔案清單。

如有指定資源,這些資源會與常見程式語言一起封裝在 jar 檔案中 編譯產生的 .class 檔案。資源內部的資源位置 取決於專案結構Bazel 首先會搜尋 Maven 標準目錄版面配置 (「src」目錄後面加上「resources」目錄外) 的目錄。如果沒有 Bazel 會接著尋找最頂端的「java」目錄或「javatests」(因此, 例如,如果資源位於 <workspace root>/x/java/y/java/z, 資源路徑會是 y/java/z。這項經驗法則無法覆寫 不過,resource_strip_prefix 屬性可用來指定 資源檔案專用的替代目錄

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

exported_plugins

List of labels; optional

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

java_plugin 的指定清單會套用至所有程式庫 就如同該程式庫明確宣告這些程式庫 plugins 中的標籤。

exports

List of labels; optional

已匯出的程式庫。

這裡的名單規則會開放父項規則使用,就像父項規則一樣 完全取決於這些規則這不適用於一般 (未匯出) deps

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

假設 A 依附於 BB 須依附於 C。在這個案例中 C 是 A 的「轉換」依附元件,因此變更 C 來源並重新建構 A 會 正確重建一切不過,A 無法在 C 中使用類別。若要允許: 這麼一來,A 必須在 deps 中宣告 C,B 則可讓 A (以及可能依賴 A 的任何情況) 只要在 (B) exports 中宣告 C 屬性。

匯出的程式庫適用於所有直接父項規則。請稍微 不同的範例:A 依附 B,B 依附於 C 和 D,且也會匯出 C 而非 D。 現在 A 可以存取 C,但無法存取 D。現在,如果 C 和 D 匯出了某些程式庫和 D' 不過,A 只能存取 C'而非「D」

重要事項:匯出的規則並非一般依附元件。沿用先前範例 如果 B 匯出 C 而想要一併使用 C,也必須 deps

javacopts

List of strings; optional

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

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

Boolean; optional; default is False

這個程式庫是否只應用於編譯,而不應在執行階段使用。 如果執行階段環境會在執行期間提供程式庫,相當實用。範例 都屬於適用於 IDE 外掛程式的 IDE API,而 tools.jar 則適用於 並在標準 JDK 上執行

請注意,neverlink = 1 不會禁止編譯器內嵌材質 在 Java 允許的情況下,從這個程式庫轉換為依附該程式庫的編譯目標 語言規格 (例如Stringstatic final 個常數 或原始類型)。因此,當執行階段程式庫在運作時 與編譯程式庫相同

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

plugins

List of labels; optional

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

List of labels; optional

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

List of labels; optional

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

String; optional

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

如果有指定,系統會從 resources 中的每個檔案移除這個路徑前置字串 屬性。將資源檔案不在這個目錄下會產生錯誤。如果不是 指定 (預設值) 時,系統會根據相同的 視為來源檔案的 Java 套件。例如,位於 stuff/java/foo/bar/a.txt 位於 foo/bar/a.txt

runtime_deps

List of labels; optional

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

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

Name; required

此目標的專屬名稱。

deps

List of labels; optional

proto_library 清單 產生 Java 程式碼

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

Name; required

此目標的專屬名稱。

deps

List of labels; optional

proto_library 清單 產生 Java 程式碼

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 封存檔 以便進行部署作業(只有在明確要求時才會建構)。請參閱 name_deploy.jar的輸出內容來源: java_binary

請參閱 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

Name; required

此目標的專屬名稱。

deps

List of labels; optional

要連結至目標的其他程式庫清單。 查看關於「deps」的一般評論: 大部分的建構規則
srcs

List of labels; optional

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

.java 類型的來源檔案已編譯。如果是 通常建議為 .java 檔案輸入產生規則的名稱 而不是檔案名稱這不僅可以提高可讀性 可讓規則較彈性地因應日後的變更:如果產生規則 日後只要修正以下位置即可:outs 產生的規則。請勿在 deps 中列出產生規則 因為這是免人工管理

.srcjar 類型的來源檔案未封裝及編譯。(如果您需要 您必須使用 Genrule 產生一組 .java 檔案)。

規則:如果規則 (通常為 genrulefilegroup) 產生 以上任何檔案,我們會依照來源說明的方式使用這些檔案 檔案。

此引數幾乎都是必要引數,除非 main_class 屬性會指定 類別,或是指定 runtime_deps 引數。

resources

List of labels; optional

要包含在 Java jar 中的資料檔案清單。

如有指定資源,這些資源會與常見程式語言一起封裝在 jar 檔案中 編譯產生的 .class 檔案。資源內部的資源位置 取決於專案結構Bazel 首先會搜尋 Maven 標準目錄版面配置 (「src」目錄後面加上「resources」目錄外) 的目錄。如果沒有 Bazel 會接著尋找最頂端的「java」目錄或「javatests」(因此, 例如,如果資源位於 <workspace root>/x/java/y/java/z, 資源路徑會是 y/java/z。這項經驗法則無法覆寫 不過,resource_strip_prefix 屬性可用來指定 資源檔案專用的替代目錄

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

classpath_resources

List of labels; optional

除非採用其他做法,否則請勿使用這個方式)

必須位於 Java 樹狀結構根目錄的資源清單。此屬性的 僅限於支援要求所屬資源 在類別路徑上找到與 "myconfig.xml" 完全相同。僅允許以下裝置使用: 可能會引發命名空間衝突的危險,而非程式庫。

create_executable

Boolean; optional; nonconfigurable; default is True

二進位檔是否為可執行檔。不可執行的二進位檔集體收集 轉換為部署 jar 檔案,但無法直接執行 如果設定這項屬性,則不會建立任何包裝函式指令碼。設定錯誤 如果 launchermain_class 屬性,則為 0 是否有設定。
deploy_manifest_lines

List of strings; optional

為資料集產生的 META-INF/manifest.mf 檔案要加入的各行清單 *_deploy.jar目標。這項屬性的內容「並非」主旨 「設為變數」
javacopts

List of strings; optional

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

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

jvm_flags

List of strings; optional

為執行此二進位檔而產生的包裝函式指令碼,要嵌入的標記清單。 須遵守 $(location) 和 「設為變數」替代,以及 Bourne 殼層權杖化

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

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

launcher

Label; optional

指定將用於執行 Java 程式的二進位檔,而非 JDK 隨附的一般 bin/java 程式。 目標必須是 cc_binary。任何符合以下條件的 cc_binary 會實作 可以將 Java Invocation API 指定為這個屬性的值。

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

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

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

  • 如果您使用一般 JDK 啟動器 (預設),原生依附元件就會 以名為 {name}_nativedeps.so 的共用資料庫建立,其中 {name} 是這項 java_binary 規則的 name 屬性。 這項設定中的連結器「不會」移除未使用的程式碼。
  • 如果您使用任何其他啟動器,原生 (C++) 依附元件會保持靜態 會連結至名為 {name}_nativedeps 的二進位檔,其中 {name} 是此 java_binary 規則的 name 屬性。在本例中 連結器會移除產生的二進位檔中未使用的程式碼 也就是說,除非使用者只透過 JNI 存取 C++ 程式碼,除非 cc_library 目標指定 alwayslink = 1

使用預設 JDK 啟動器以外的任何啟動器時,系統會將其格式 的 *_deploy.jar 輸出值會變更。查看主要 java_binary 文件。

main_class

String; optional

具有 main() 方法的類別名稱,用於做為進入點。 如果規則使用這個選項,則不需要 srcs=[...] 清單。 因此,有了這個屬性,使用者 包含一或多個 main() 方法。

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

plugins

List of labels; optional

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

List of labels; optional

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

String; optional

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

如果有指定,系統會從 resources 中的每個檔案移除這個路徑前置字串 屬性。將資源檔案不在這個目錄下會產生錯誤。如果不是 指定 (預設值) 時,系統會根據相同的 視為來源檔案的 Java 套件。例如,位於 stuff/java/foo/bar/a.txt 位於 foo/bar/a.txt

runtime_deps

List of labels; optional

僅可在執行階段提供給最終二進位檔或測試的程式庫。 與一般的 deps 相同,這些項目會顯示在執行階段的類別路徑中,但與一般的 deps 不同 而非編譯時間類別路徑應該只有執行階段所需的依附元件 這裡列出的條件依附元件分析工具應忽略同時顯示在兩者中的目標 《runtime_deps》和《deps》。
stamp

Integer; optional; default is 0

是否將建構資訊編碼為二進位檔。可能的值包括:
  • stamp = 1:一律在二進位檔中加上建構資訊加上戳記,即使在 --nostamp 版本。本 建議避免設定,因為這可能會終止 以及任何相依的下游動作
  • stamp = 0:一律以常數值取代建構資訊。這個 也提供良好的建構結果快取功能
  • stamp = -1:建構資訊的嵌入功能是由 --[no]stamp 旗標。

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

test_class

String; optional

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

如未定義這個引數,則預設會使用舊版模式, 改為使用測試引數設定 --nolegacy_bazel_java_test 標記 就不會在第一個引數上備用

這個屬性會指定要執行的 Java 類別名稱 測試。這項設定很少需要設定。省略這個引數時 系統會根據目標的 name 及其 來源-根相對路徑。如果測試位置不在已知 如果 test_class,Bazel 就會回報錯誤 未設定。

如果是 JUnit3,測試類別必須是 junit.framework.TestCase,否則就必須是公開的 靜態 suite() 方法, junit.framework.Test (或 Test 的子類別)。 如果是 JUnit4,類別必須加註 org.junit.runner.RunWith

這項屬性允許多項 java_test 規則 共用相同的Test (TestCaseTestSuite...)。一般價格 這項查詢會傳遞額外資訊 (例如透過 jvm_flags=['-Dkey=value']) 情況不同,例如執行不同的 測試子集此屬性也允許 在 javatests 樹狀結構外的 Java 測試。

use_launcher

Boolean; optional; default is True

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

如果此屬性設為 false, launcher 屬性和相關的 --java_launcher 標記 將忽略此目標。

use_testrunner

Boolean; optional; default is 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

Name; required

此目標的專屬名稱。

data

List of labels; optional

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

List of strings; optional

Java 編譯器標記。
packages

List of labels; optional

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

Name; required

此目標的專屬名稱。

deps

List of labels; optional

連結至這個程式庫的程式庫清單。 查看關於「deps」的一般評論: 大部分的建構規則

由「deps」所列的 java_library 規則所建立的罐子將會啟動 這個規則的編譯時間類別路徑此外,資料中心的遞移性關閉 depsruntime_depsexports將於以下位置進入: 執行執行階段類別路徑

相反地,data 屬性中的目標會包含在執行檔案中, 不會在 compile-time 或執行階段類別路徑上

srcs

List of labels; optional

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

.java 類型的來源檔案已編譯。如果是 通常建議為 .java 檔案輸入產生規則的名稱 而不是檔案名稱這不僅可以提高可讀性 可讓規則較彈性地因應日後的變更:如果產生規則 日後只要修正以下位置即可:outs 產生的規則。請勿在 deps 中列出產生規則 因為這是免人工管理

.srcjar 類型的來源檔案未封裝及編譯。(如果您需要 您必須使用 Genrule 產生一組 .java 檔案)。

規則:如果規則 (通常為 genrulefilegroup) 產生 以上任何檔案,我們會依照來源說明的方式使用這些檔案 檔案。

此引數幾乎都是必要引數,除非 main_class 屬性會指定 類別,或是指定 runtime_deps 引數。

data

List of labels; optional

這個程式庫在執行階段所需的檔案清單。 查看關於「data」的一般評論: 大部分的建構規則

建構 java_library 時,Bazel 不會將這些檔案存放在任何位置;如果 系統會產生 data 檔案,然後由 Bazel 產生這些檔案。建立容器時 仰賴此 java_library Bazel 複製或連結 data 檔案進入執行檔案區域。

resources

List of labels; optional

要包含在 Java jar 中的資料檔案清單。

如有指定資源,這些資源會與常見程式語言一起封裝在 jar 檔案中 編譯產生的 .class 檔案。資源內部的資源位置 取決於專案結構Bazel 首先會搜尋 Maven 標準目錄版面配置 (「src」目錄後面加上「resources」目錄外) 的目錄。如果沒有 Bazel 會接著尋找最頂端的「java」目錄或「javatests」(因此, 例如,如果資源位於 <workspace root>/x/java/y/java/z, 資源路徑會是 y/java/z。這項經驗法則無法覆寫 不過,resource_strip_prefix 屬性可用來指定 資源檔案專用的替代目錄

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

generates_api

Boolean; optional; default is False

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

如果規則使用 API 產生註解處理工具,則其他規則 只有在 編譯動作會在產生規則後排定這個 屬性指示 Bazel 在什麼情況下引入排程限制 --java_header_compile 已啟用。

警告:這項屬性會影響版本 就必須只在必要時使用。

javacopts

List of strings; optional

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

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

Boolean; optional; default is False

這個程式庫是否只應用於編譯,而不應在執行階段使用。 如果執行階段環境會在執行期間提供程式庫,相當實用。範例 都屬於適用於 IDE 外掛程式的 IDE API,而 tools.jar 則適用於 並在標準 JDK 上執行

請注意,neverlink = 1 不會禁止編譯器內嵌材質 在 Java 允許的情況下,從這個程式庫轉換為依附該程式庫的編譯目標 語言規格 (例如Stringstatic final 個常數 或原始類型)。因此,當執行階段程式庫在運作時 與編譯程式庫相同

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

output_licenses

Licence type; optional

查看「common attributes
plugins

List of labels; optional

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

String; optional

處理器類別是 Java 編譯器應對類別的完整類型 做為註解處理工具的進入點如果沒有指定,則不會 為 Java 編譯器的註解處理提供一個註解處理工具 執行階段類別路徑仍會包含在編譯器的註解處理工具路徑中。(這 主要適用於 Error Prone 外掛程式,已載入 來自註解處理工具路徑 java.util.ServiceLoader.)
proguard_specs

List of labels; optional

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

List of labels; optional

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

String; optional

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

如果有指定,系統會從 resources 中的每個檔案移除這個路徑前置字串 屬性。將資源檔案不在這個目錄下會產生錯誤。如果不是 指定 (預設值) 時,系統會根據相同的 視為來源檔案的 Java 套件。例如,位於 stuff/java/foo/bar/a.txt 位於 foo/bar/a.txt

java_runtime

java_runtime(name, srcs, compatible_with, deprecation, distribs, features, hermetic_srcs, java, java_home, 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

Name; required

此目標的專屬名稱。

srcs

List of labels; optional

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

List of labels; optional

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

Label; optional

Java 執行檔的路徑。
java_home

String; optional

執行階段的根路徑。 取決於 「廠牌」變數替代。 如果這個路徑是絕對路徑,則規則會指出非密封的 Java 執行階段具有已知已知的 路徑。在此情況下,srcsjava 屬性必須留空。
lib_modules

Label; optional

進行密封部署所需的 lib/modules 檔案。
version

Integer; optional; default is 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_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

Name; required

此目標的專屬名稱。

android_lint_data

List of labels; optional

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

List of strings; optional

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

List of strings; optional

Android Lint 引數清單。
android_lint_package_configuration

List of labels; optional

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

Label; optional

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

List of labels; optional

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

List of labels; optional

ImportDepsChecker 部署 jar 的標籤。
forcibly_disable_header_compilation

Boolean; optional; default is False

覆寫 --java_header_compile 在沒有的平台上停用標頭編譯 例如JDK 7 Bazel。
genclass

List of labels; required

GenClass 部署 jar 標籤。
header_compiler

List of labels; optional

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

List of labels; optional

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

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

ijar

List of labels; required

ijar 執行檔的標籤。
jacocorunner

Label; optional

JacocoCoverageRunner 部署 jar 標籤。
java_runtime

Label; required

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

List of labels; required

JavaBuilder 部署 jar 標籤。
javabuilder_data

List of labels; optional

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

List of strings; optional

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

Boolean; optional; default is True

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

Boolean; optional; default is True

如果 JavaBuilder 支援做為永久工作站執行,則為「true」,否則為「false」。
javacopts

List of strings; optional

Java 編譯器的額外引數清單。請參閱 Java 編譯器 查看完整版 Java 編譯器標記清單的說明文件。
jvm_opts

List of strings; optional

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

Label; optional

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

Label; optional

單一版本許可清單的標籤。
package_configuration

List of labels; optional

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

Label; optional; default is @bazel_tools//tools/jdk:proguard_whitelister

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

List of labels; optional

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

List of labels; required

SingleJar 部署 jar 的標籤。
source_version

String; optional

Java 原始碼版本 (例如「6」或「7」)。指出這組程式碼結構 。
target_version

String; optional

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

Label; optional

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

List of labels; optional

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

List of labels; optional

turbine_jvm_opts 中可用於標籤擴充的資料標籤。
turbine_jvm_opts

List of strings; optional

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

List of strings; optional

要新增或移除預設清單中的警告清單。前面加上破折號 移除。詳情請參閱 -Xlint 選項的 Javac 說明文件。