规则
- 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 文件”),以及与规则同名的封装容器 Shell 脚本。封装容器 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
选项来运行该文件。首选使用封装容器脚本优于java -jar
,因为它还会传递 JVM 标记和加载原生库的选项。部署 jar 包含类加载器从头到尾搜索二进制文件的封装容器脚本的类路径时能找到的所有类。它还包含依赖项所需的原生库。这些文件在运行时会自动加载到 JVM 中。
如果您的目标指定了 launcher 属性,那么 _deploy.jar 将是原生二进制文件,而不是普通的 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 加载的插件时设置此属性。设置此属性会从此二进制文件的运行时类路径(和部署 jar)中排除在此二进制文件与 deploy_env 中指定的目标之间共享的所有依赖项。
|
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)。 相关的 请注意,您的原生(C++、SWIG、JNI)依赖项的构建方式有所不同,具体取决于您使用的是 JDK 启动器还是其他启动器:
使用默认 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,则对于此目标,系统将忽略 launcher 属性和相关的 |
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 。
|
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
:包含源代码的归档(“源 jar”)。
参数
属性 | |
---|---|
name |
此目标的唯一名称。 |
deps
|
deps 的一般注释。
通过
相比之下, |
srcs
|
系统会编译
系统会解压缩并编译
规则:如果规则(通常为
此参数几乎始终是必需的,除非 |
data
|
data 的一般注释。
构建 |
resources
|
如果指定了资源,它们将与编译生成的常用 资源可以是源文件,也可以是生成的文件。 |
exported_plugins
|
java_plugin (例如注解处理器)列表。
指定的 |
exports
|
在此处列出规则会使其可供父级规则使用,就好像父级明确依赖于这些规则一样。但对于常规(不可导出的)
摘要:如果规则 X 之间存在以
假设 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',则 A 只能访问 C',而无法访问 D'。
重要提示:导出的规则不是常规依赖项。继续以前面的示例为例,如果 B 导出 C 并且也想使用 C,它还必须在自己的 |
javacopts
|
这些编译器选项在全局编译器选项之后传递给 javac。 |
neverlink
|
tools.jar 。
请注意,在 Java 语言规范(例如 如果运行时库与编译库不同,您必须确保它仅在 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)。 相关的 请注意,您的原生(C++、SWIG、JNI)依赖项的构建方式有所不同,具体取决于您使用的是 JDK 启动器还是其他启动器:
使用默认 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,则对于此目标,系统将忽略 launcher 属性和相关的 |
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 归档。
除了添加了 processor_class
参数之外,其他参数与 java_library
相同。
参数
属性 | |
---|---|
name |
此目标的唯一名称。 |
deps
|
deps 的一般注释。
通过
相比之下, |
srcs
|
系统会编译
系统会解压缩并编译
规则:如果规则(通常为
此参数几乎始终是必需的,除非 |
data
|
data 的一般注释。
构建 |
resources
|
如果指定了资源,它们将与编译生成的常用 资源可以是源文件,也可以是生成的文件。 |
generates_api
|
如果某条规则使用 API 生成注解处理器,则依赖于该规则的其他规则只有在其编译操作安排在生成规则之后才能引用生成的代码。启用 --java_header_compilation 时,此属性会指示 Bazel 引入调度限制。 警告:此属性会影响构建性能,请仅在必要时使用。 |
javacopts
|
这些编译器选项在全局编译器选项之后传递给 javac。 |
neverlink
|
tools.jar 。
请注意,在 Java 语言规范(例如 如果运行时库与编译库不同,您必须确保它仅在 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
|
|