規則
- java_binary
- java_import
- java_library
- java_lite_proto_library
- java_proto_library
- java_test
- java_package_configuration
- java_plugin
- java_runtime
- java_toolchain
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。
不含 srcs
的 java_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
|
系統會編譯
規則:如果規則 (通常是
這個引數幾乎一律必要,除非 |
resources
|
指定資源後,系統會將這些資源和編譯產生的一般 資源可以是來源檔案或已產生的檔案。 |
classpath_resources
|
必須位於 Java 樹狀結構根目錄的資源清單。此屬性的唯一用途是支援需要將資源從類別路徑中找到為 |
create_executable
|
launcher 或 main_class 屬性,將此值設為 0 會發生錯誤。
|
deploy_env
|
java_binary 目標清單,代表此二進位檔的部署環境。當您建構由另一個 java_binary 載入的外掛程式時,請設定這個屬性。設定這項屬性後,系統會從這個二進位檔與 deploy_env 中指定的目標之間共用的執行階段類別路徑 (以及 Deployment jar) 排除所有依附元件。 |
deploy_manifest_lines
|
*_deploy.jar 目標產生的 META-INF/manifest.mf 檔案的行清單。這項屬性的內容「不」適用「Make 變數」替代方式。 |
javacopts
|
這些編譯器選項會在全域編譯器選項之後傳遞至 javac。 |
jvm_flags
|
Java 二進位檔的包裝函式指令碼包含 CLASSPATH 定義 (用於尋找所有相依 jar),並叫用正確的 Java 解譯器。包裝函式指令碼產生的指令列包含主要類別名稱,後面加上 請注意,這個屬性對 |
launcher
|
bin/java 程式。目標必須是 cc_binary 。你可以將任何導入
Java Invocation API 的 cc_binary 指定為這項屬性的值。根據預設,Bazel 會使用一般的 JDK 啟動器 (bin/java 或 java.exe)。 相關的 請注意,視您使用的是 JDK 啟動器或其他啟動器而定,原生 (C++、SWIG、JNI) 依附元件的建構方式會有所不同:
使用預設 JDK 啟動器以外的任何啟動器時, |
main_class
|
main() 方法的類別名稱,用於做為進入點。如果規則使用這個選項,就不需要 srcs=[...] 清單。因此,只要使用這個屬性,即可透過已包含一或多個 main() 方法的 Java 程式庫,建立執行檔。
此屬性的值是類別名稱,而非來源檔案。類別必須在執行階段可用:可能由這項規則 (從 |
plugins
|
java_plugin 都會執行。程式庫也可能會繼承使用 exported_plugins 的依附元件的外掛程式。外掛程式產生的資源會納入這項規則產生的 jar 中。 |
resource_jars
|
|
resource_strip_prefix
|
如有指定,系統會從 |
runtime_deps
|
deps 一樣,這些項目會顯示在執行階段類別路徑上,但與編譯時間類別路徑不同,而非在編譯時間類別路徑上。這裡會列出只有執行階段所需的依附元件。依附元件分析工具應忽略同時出現在 runtime_deps 和 deps 中的目標。 |
stamp
|
除非二進位檔的依附元件變更,否則系統「不會」重新建立經過加載的二進位檔。 |
use_launcher
|
如果將這項屬性設為 false,系統會忽略這個目標的啟動器屬性和相關的 |
use_testrunner
|
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_library
和 java_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
|
|
constraints
|
|
exports
|
|
jars
|
|
neverlink
|
tools.jar 適用於在標準 JDK 上執行的任何項目。 |
proguard_specs
|
android_binary 目標。這裡所含檔案只能包含冪等規則、-dontnote、-dontwarn、假設無副作用,以及以 -keep 開頭的規則。其他選項只能顯示在 android_binary 的 proguard_specs 中,以確保非自動化的合併情況。
|
runtime_deps
|
|
srcjar
|
|
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 的一般註解。
相較之下, |
srcs
|
系統會編譯
規則:如果規則 (通常是
這個引數幾乎一律必要,除非 |
data
|
data 的一般註解。
建構 |
resources
|
指定資源後,系統會將這些資源和編譯產生的一般 資源可以是來源檔案或已產生的檔案。 |
exported_plugins
|
java_plugin 清單 (例如註解處理工具)。
指定的 |
exports
|
這裡的產品資訊規則適用於父項規則,就像父項明確依附這些規則一樣。對一般 (未匯出) 的
摘要:如果依附元件路徑開頭為
假設 A 依附於 B,B 取決於 C。在這種情況下,C 是 A 的「遞移」依附元件,因此變更 C 來源並重新建構 A 即可正確重建所有項目。不過,A 無法在 C 中使用類別,為了實現此目標,A 必須在其 如要停用匯出的程式庫,所有直接父項規則皆可使用。請稍微改變範例:A 依附 B,B 依附於 C 和 D,且匯出 C 但不匯出 D。現在 A 可以存取 C,但無法存取 D。現在,如果 C 和 D 分別匯出了部分程式庫,C' 和 D' 則只能存取 C',但無法存取 D'。
重要事項:匯出的規則並非一般的依附元件。延續上例,如果 B 匯出 C 且想使用 C,則必須一併列出其本身的 |
javacopts
|
這些編譯器選項會在全域編譯器選項之後傳遞至 javac。 |
neverlink
|
tools.jar 適用於在標準 JDK 上執行的任何項目。
請注意, 如果執行階段程式庫與編譯程式庫不同,您必須確保該程式庫只有在 JLS 禁止編譯器插入內嵌項目 (且日後必須保留所有日後的 JLS 版本) 時,兩者才會有所不同。 |
plugins
|
java_plugin 都會執行。程式庫也可能會繼承使用 exported_plugins 的依附元件的外掛程式。外掛程式產生的資源會納入這項規則產生的 jar 中。 |
proguard_specs
|
android_binary 目標。這裡所含檔案只能包含冪等規則、-dontnote、-dontwarn、假設無副作用,以及以 -keep 開頭的規則。其他選項只能顯示在 android_binary 的 proguard_specs 中,以確保非自動化的合併情況。
|
resource_jars
|
|
resource_strip_prefix
|
如有指定,系統會從 |
runtime_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 |
此目標的專屬名稱。 |
deps
|
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
|
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_binary 中name_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
|
系統會編譯
規則:如果規則 (通常是
這個引數幾乎一律必要,除非 |
resources
|
指定資源後,系統會將這些資源和編譯產生的一般 資源可以是來源檔案或已產生的檔案。 |
classpath_resources
|
必須位於 Java 樹狀結構根目錄的資源清單。此屬性的唯一用途是支援需要將資源從類別路徑中找到為 |
create_executable
|
launcher 或 main_class 屬性,將此值設為 0 會發生錯誤。
|
deploy_manifest_lines
|
*_deploy.jar 目標產生的 META-INF/manifest.mf 檔案的行清單。這項屬性的內容「不」適用「Make 變數」替代方式。 |
javacopts
|
這些編譯器選項會在全域編譯器選項之後傳遞至 javac。 |
jvm_flags
|
Java 二進位檔的包裝函式指令碼包含 CLASSPATH 定義 (用於尋找所有相依 jar),並叫用正確的 Java 解譯器。包裝函式指令碼產生的指令列包含主要類別名稱,後面加上 請注意,這個屬性對 |
launcher
|
bin/java 程式。目標必須是 cc_binary 。你可以將任何導入
Java Invocation API 的 cc_binary 指定為這項屬性的值。根據預設,Bazel 會使用一般的 JDK 啟動器 (bin/java 或 java.exe)。 相關的 請注意,視您使用的是 JDK 啟動器或其他啟動器而定,原生 (C++、SWIG、JNI) 依附元件的建構方式會有所不同:
使用預設 JDK 啟動器以外的任何啟動器時, |
main_class
|
main() 方法的類別名稱,用於做為進入點。如果規則使用這個選項,就不需要 srcs=[...] 清單。因此,只要使用這個屬性,即可透過已包含一或多個 main() 方法的 Java 程式庫,建立執行檔。
此屬性的值是類別名稱,而非來源檔案。類別必須在執行階段可用:可能由這項規則 (從 |
plugins
|
java_plugin 都會執行。程式庫也可能會繼承使用 exported_plugins 的依附元件的外掛程式。外掛程式產生的資源會納入這項規則產生的 jar 中。 |
resource_jars
|
|
resource_strip_prefix
|
如有指定,系統會從 |
runtime_deps
|
deps 一樣,這些項目會顯示在執行階段類別路徑上,但與編譯時間類別路徑不同,而非在編譯時間類別路徑上。這裡會列出只有執行階段所需的依附元件。依附元件分析工具應忽略同時出現在 runtime_deps 和 deps 中的目標。 |
stamp
|
除非二進位檔的依附元件變更,否則系統「不會」重新建立經過加載的二進位檔。 |
test_class
|
根據預設,如未定義這個引數,系統會使用舊版模式,並改用測試引數。將
這項屬性會指定這項測試要執行的 Java 類別名稱。這種情況很少見。如果省略這個引數,系統將使用目標的
如果是 JUnit3,測試類別必須是
這項屬性可讓多個 |
use_launcher
|
如果將這項屬性設為 false,系統會忽略這個目標的啟動器屬性和相關的 |
use_testrunner
|
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
|
|
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_library
或 java_binary
規則可透過 plugins
屬性,以依附於外掛程式的方式執行外掛程式。java_library
也可使用 exported_plugins
,自動將外掛程式匯出至直接仰賴外掛程式的程式庫。
隱式輸出目標
libname.jar
:Java 封存。
引數與 java_library
相同,但新增 processor_class
引數除外。
引數
屬性 | |
---|---|
name |
此目標的專屬名稱。 |
deps
|
deps 的一般註解。
相較之下, |
srcs
|
系統會編譯
規則:如果規則 (通常是
這個引數幾乎一律必要,除非 |
data
|
data 的一般註解。
建構 |
resources
|
指定資源後,系統會將這些資源和編譯產生的一般 資源可以是來源檔案或已產生的檔案。 |
generates_api
|
如果規則使用產生 API 的註解處理工具,則根據該規則而定的其他規則只能參照產生的程式碼,前提是其編譯動作是在產生規則之後執行。這個屬性會指示 Bazel 在啟用 --java_header_compile 時,導入排程限制。 警告:這個屬性會影響建構效能,請只在必要時使用。 |
javacopts
|
這些編譯器選項會在全域編譯器選項之後傳遞至 javac。 |
neverlink
|
tools.jar 適用於在標準 JDK 上執行的任何項目。
請注意, 如果執行階段程式庫與編譯程式庫不同,您必須確保該程式庫只有在 JLS 禁止編譯器插入內嵌項目 (且日後必須保留所有日後的 JLS 版本) 時,兩者才會有所不同。 |
output_licenses
|
common attributes
|
plugins
|
java_plugin 都會執行。程式庫也可能會繼承使用 exported_plugins 的依附元件的外掛程式。外掛程式產生的資源會納入這項規則產生的 jar 中。 |
processor_class
|
|
proguard_specs
|
android_binary 目標。這裡所含檔案只能包含冪等規則、-dontnote、-dontwarn、假設無副作用,以及以 -keep 開頭的規則。其他選項只能顯示在 android_binary 的 proguard_specs 中,以確保非自動化的合併情況。
|
resource_jars
|
|
resource_strip_prefix
|
如有指定,系統會從 |
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 |
此目標的專屬名稱。 |
srcs
|
|
hermetic_srcs
|
|
java
|
|
java_home
|
srcs 和 java 屬性必須留空。
|
lib_modules
|
|
version
|
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 |
此目標的專屬名稱。 |
android_lint_data
|
|
android_lint_jvm_opts
|
|
android_lint_opts
|
|
android_lint_package_configuration
|
|
android_lint_runner
|
|
bootclasspath
|
|
deps_checker
|
|
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
|
|
oneversion
|
|
oneversion_whitelist
|
|
package_configuration
|
|
proguard_allowlister
|
|
resourcejar
|
|
singlejar
|
|
source_version
|
|
target_version
|
|
timezone_data
|
|
tools
|
|
turbine_data
|
|
turbine_jvm_opts
|
|
xlint
|
|