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 檔案」),以及與規則名稱相同的包裝函式殼層指令碼。包裝函式殼層指令碼會使用類別路徑,其中包括每個二進位檔依附的程式庫的 jar 檔案。

包裝函式指令碼可接受多個專屬旗標。如需包裝函式接受可設定標記和環境變數的清單,請參閱 //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 選項執行。建議您使用包裝函式指令碼,因為這麼做也會傳遞 JVM 旗標和載入原生程式庫的選項。java -jar

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

    如果目標指定了「launcher」屬性,那麼 _deploy.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

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 中的資料檔案清單。

指定資源後,系統會將這些資源和編譯產生的一般 .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

List of labels; optional

除非是任何其他方式,否則請勿使用此選項)

必須位於 Java 樹狀結構根目錄的資源清單。此屬性的唯一用途是支援需要將資源從類別路徑中找到為 "myconfig.xml" 的第三方程式庫。但由於命名空間發生衝突,因此這個方法只能用於二進位檔,不適用於程式庫。

create_executable

Boolean; optional; nonconfigurable; default is True

二進位檔是否可執行。非可執行的二進位檔將遞移執行階段 Java 依附元件收集到部署 Jar 中,但無法直接執行。如果設定這個屬性,系統就不會建立任何包裝函式指令碼。如果設定了 launchermain_class 屬性,將此值設為 0 會發生錯誤。
deploy_env

List of labels; optional

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

List of strings; optional

要新增至針對 *_deploy.jar 目標產生的 META-INF/manifest.mf 檔案的行清單。這項屬性的內容「不」適用「Make 變數」替代方式。
javacopts

List of strings; optional

這個程式庫的其他編譯器選項。須遵守「Make 變數」替代和 Bourne 殼層權杖化相關說明。

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

jvm_flags

List of strings; optional

在執行此二進位檔而產生的包裝函式指令碼中嵌入的標記清單。取決於 $(location)「Make 變數」替代變數,以及 Bourne 殼層權杖化

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

請注意,這個屬性對 *_deploy.jar 輸出沒有影響

launcher

Label; optional

指定要用來執行 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

String; optional

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

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

plugins

List of labels; optional

要在編譯期間執行的 Java 編譯器外掛程式。每當建構這項規則時,這項屬性中指定的所有 java_plugin 都會執行。程式庫也可能會繼承使用 exported_plugins 的依附元件的外掛程式。外掛程式產生的資源會納入這項規則產生的 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 一樣,這些項目會顯示在執行階段類別路徑上,但與編譯時間類別路徑不同,而非在編譯時間類別路徑上。這裡會列出只有執行階段所需的依附元件。依附元件分析工具應忽略同時出現在 runtime_depsdeps 中的目標。
stamp

Integer; optional; default is -1

是否將建構資訊編碼為二進位檔。可能的值包括:
  • stamp = 1:一律將建構資訊排入二進位檔,即使是在 --nostamp 版本中亦然。建議避免使用這項設定,因為這項設定可能會終止對二進位檔及任何依附於該設定的下游動作的遠端快取。
  • stamp = 0:一律使用常數值取代建構資訊。這可以產生良好的建構結果快取。
  • stamp = -1:嵌入建構資訊是由 --[no]stamp 旗標控管。

除非二進位檔的依附元件變更,否則系統「不會」重新建立經過加載的二進位檔。

use_launcher

Boolean; optional; default is True

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

如果將這項屬性設為 false,系統會忽略這個目標的啟動器屬性和相關的 --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 外掛程式的 IDE API,或 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:包含來源的封存檔 (「source jar」)。

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

連結至這個程式庫的程式庫清單。請參閱「大多數建構規則定義的一般屬性」一文,查看有關 deps 的一般註解。

deps 中列出的 java_library 規則建立的 jar 會位在這項規則的編譯時間類別路徑上。此外,其 depsruntime_depsexports 的遞移性關閉作業仍在執行階段類別路徑中。

相較之下,data 屬性中的目標會包含在執行檔案中,但不會納入編譯時間和執行階段類別路徑。

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 中的資料檔案清單。

指定資源後,系統會將這些資源和編譯產生的一般 .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

List of labels; optional

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

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

exports

List of labels; optional

已匯出的程式庫。

這裡的產品資訊規則適用於父項規則,就像父項明確依附這些規則一樣。對一般 (未匯出) 的 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' 則只能存取 C',但無法存取 D'。

重要事項:匯出的規則並非一般的依附元件。延續上例,如果 B 匯出 C 且想使用 C,則必須一併列出其本身的 deps

javacopts

List of strings; optional

這個程式庫的其他編譯器選項。須遵守「Make 變數」替代和 Bourne 殼層權杖化相關說明。

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

Boolean; optional; default is False

這個程式庫是否只應用於編譯,而不是在執行階段。如果在執行期間由執行階段環境提供程式庫,此屬性就非常實用。這類程式庫的範例包括 IDE 外掛程式的 IDE API,或 tools.jar 適用於在標準 JDK 上執行的任何項目。

請注意,neverlink = 1 不會阻止編譯器將這個程式庫的內容內嵌到依附於該程式庫的編譯目標,例如String 或原始類型的 static final 常數。因此,建議用途是執行階段程式庫與編譯程式庫相同。

如果執行階段程式庫與編譯程式庫不同,您必須確保該程式庫只有在 JLS 禁止編譯器插入內嵌項目 (且日後必須保留所有日後的 JLS 版本) 時,兩者才會有所不同。

plugins

List of labels; optional

要在編譯期間執行的 Java 編譯器外掛程式。每當建構這項規則時,這項屬性中指定的所有 java_plugin 都會執行。程式庫也可能會繼承使用 exported_plugins 的依附元件的外掛程式。外掛程式產生的資源會納入這項規則產生的 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 一樣,這些項目會顯示在執行階段類別路徑上,但與編譯時間類別路徑不同,而非在編譯時間類別路徑上。這裡會列出只有執行階段所需的依附元件。依附元件分析工具應忽略同時出現在 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

Name; required

此目標的專屬名稱。

deps

List of labels; optional

用於產生 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

Name; required

此目標的專屬名稱。

deps

List of labels; optional

用於產生 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

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 中的資料檔案清單。

指定資源後,系統會將這些資源和編譯產生的一般 .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

List of labels; optional

除非是任何其他方式,否則請勿使用此選項)

必須位於 Java 樹狀結構根目錄的資源清單。此屬性的唯一用途是支援需要將資源從類別路徑中找到為 "myconfig.xml" 的第三方程式庫。但由於命名空間發生衝突,因此這個方法只能用於二進位檔,不適用於程式庫。

create_executable

Boolean; optional; nonconfigurable; default is True

二進位檔是否可執行。非可執行的二進位檔將遞移執行階段 Java 依附元件收集到部署 Jar 中,但無法直接執行。如果設定這個屬性,系統就不會建立任何包裝函式指令碼。如果設定了 launchermain_class 屬性,將此值設為 0 會發生錯誤。
deploy_manifest_lines

List of strings; optional

要新增至針對 *_deploy.jar 目標產生的 META-INF/manifest.mf 檔案的行清單。這項屬性的內容「不」適用「Make 變數」替代方式。
javacopts

List of strings; optional

這個程式庫的其他編譯器選項。須遵守「Make 變數」替代和 Bourne 殼層權杖化相關說明。

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

jvm_flags

List of strings; optional

在執行此二進位檔而產生的包裝函式指令碼中嵌入的標記清單。取決於 $(location)「Make 變數」替代變數,以及 Bourne 殼層權杖化

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

請注意,這個屬性對 *_deploy.jar 輸出沒有影響

launcher

Label; optional

指定要用來執行 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

String; optional

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

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

plugins

List of labels; optional

要在編譯期間執行的 Java 編譯器外掛程式。每當建構這項規則時,這項屬性中指定的所有 java_plugin 都會執行。程式庫也可能會繼承使用 exported_plugins 的依附元件的外掛程式。外掛程式產生的資源會納入這項規則產生的 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 一樣,這些項目會顯示在執行階段類別路徑上,但與編譯時間類別路徑不同,而非在編譯時間類別路徑上。這裡會列出只有執行階段所需的依附元件。依附元件分析工具應忽略同時出現在 runtime_depsdeps 中的目標。
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 的子類別,或是需包含會傳回 junit.framework.Test (或 Test 的子類別) 的公開靜態 suite() 方法。如果是 JUnit4,則必須使用 org.junit.runner.RunWith 註解類別。

這項屬性可讓多個 java_test 規則共用相同的 Test (TestCaseTestSuite、...)。一般來說,系統會將額外資訊傳遞給這個類別 (例如透過 jvm_flags=['-Dkey=value']),因此其行為在各情況下都不同,例如執行不同的測試子集。這個屬性還可以在 javatests 樹狀結構外使用 Java 測試。

use_launcher

Boolean; optional; default is True

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

如果將這項屬性設為 false,系統會忽略這個目標的啟動器屬性和相關的 --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 規則建立的 jar 會位在這項規則的編譯時間類別路徑上。此外,其 depsruntime_depsexports 的遞移性關閉作業仍在執行階段類別路徑中。

相較之下,data 屬性中的目標會包含在執行檔案中,但不會納入編譯時間和執行階段類別路徑。

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 中的資料檔案清單。

指定資源後,系統會將這些資源和編譯產生的一般 .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

Boolean; optional; default is False

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

如果規則使用產生 API 的註解處理工具,則根據該規則而定的其他規則只能參照產生的程式碼,前提是其編譯動作是在產生規則之後執行。這個屬性會指示 Bazel 在啟用 --java_header_compile 時,導入排程限制。

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

javacopts

List of strings; optional

這個程式庫的其他編譯器選項。須遵守「Make 變數」替代和 Bourne 殼層權杖化相關說明。

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

Boolean; optional; default is False

這個程式庫是否只應用於編譯,而不是在執行階段。如果在執行期間由執行階段環境提供程式庫,此屬性就非常實用。這類程式庫的範例包括 IDE 外掛程式的 IDE API,或 tools.jar 適用於在標準 JDK 上執行的任何項目。

請注意,neverlink = 1 不會阻止編譯器將這個程式庫的內容內嵌到依附於該程式庫的編譯目標,例如String 或原始類型的 static final 常數。因此,建議用途是執行階段程式庫與編譯程式庫相同。

如果執行階段程式庫與編譯程式庫不同,您必須確保該程式庫只有在 JLS 禁止編譯器插入內嵌項目 (且日後必須保留所有日後的 JLS 版本) 時,兩者才會有所不同。

output_licenses

Licence type; optional

查看 common attributes
plugins

List of labels; optional

要在編譯期間執行的 Java 編譯器外掛程式。每當建構這項規則時,這項屬性中指定的所有 java_plugin 都會執行。程式庫也可能會繼承使用 exported_plugins 的依附元件的外掛程式。外掛程式產生的資源會納入這項規則產生的 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, 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

執行階段根目錄的路徑。需要使用「Make」變數替代。如果這個路徑是絕對路徑,規則代表具有知名路徑的非密封 Java 執行階段。在這種情況下,srcsjava 屬性必須留空。
lib_modules

Label; optional

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

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 中標籤-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 中標籤-expansion 的資料標籤。
javabuilder_jvm_opts

List of strings; optional

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

Boolean; optional; default is True

如果 JavaBuilder 支援以多 x 永久工作站的形式執行,則為「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」)。它會指定 Java 原始碼中允許的一組程式碼結構。
target_version

String; optional

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

Label; optional

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

List of labels; optional

jvm_opts 中標籤-expansion 的工具標籤。
turbine_data

List of labels; optional

turbine_jvm_opts 中標籤-expansion 的資料標籤。
turbine_jvm_opts

List of strings; optional

叫用渦輪時 JVM 的引數清單。
xlint

List of strings; optional

會在預設清單中新增或移除的警告清單。在後方加上破折號即可移除。詳情請參閱 -Xlint 選項的 Javac 說明文件。