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 脚本。封装容器 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 的情况除外。

没有 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 加载的插件时设置此属性。
设置此属性会从此二进制文件的运行时类路径(和部署 jar)中排除在此二进制文件与 deploy_env 中指定的目标之间共享的所有依赖项。
deploy_manifest_lines

List of strings; optional

要添加到为 *_deploy.jar 目标生成的 META-INF/manifest.mf 文件中的行列表。此属性的内容不能替换为“Make 变量”替换项。
javacopts

List of strings; optional

此库的额外编译器选项。 可以使用“Make 变量”替换和 Bourne shell 令牌化

这些编译器选项在全局编译器选项之后传递给 javac。

jvm_flags

List of strings; optional

要嵌入为运行此二进制文件而生成的封装容器脚本中的标志列表。支持使用 $(location)“Make 变量”替换,以及 Bourne shell 标记化

Java 二进制文件的封装容器脚本包含 CLASSPATH 定义(以查找所有依赖的 jar),并调用正确的 Java 解释器。封装容器脚本生成的命令行包含主类的名称,后跟 "$@",因此您可以在类名称后面传递其他参数。但是,在命令行中,必须在类名称之前指定用于 JVM 解析的参数。jvm_flags 的内容会先添加到封装容器脚本中,再列出类名称。

请注意,此属性对 *_deploy.jar 输出没有影响

launcher

Label; optional

指定将用于运行 Java 程序(而非 JDK 附带的常规 bin/java 程序)的二进制文件。目标必须是 cc_binary。可以将实现 Java Invocation API 的任何 cc_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

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

是否将 build 信息编码到二进制文件中。可能的值包括:
  • stamp = 1:始终将 build 信息压印到二进制文件中,即使在 --nostamp build 中也是如此。应避免此设置,因为它可能会终止对该二进制文件的远程缓存以及依赖于该二进制文件的任何下游操作。
  • stamp = 0:始终用常量值替换 build 信息。这样可以提供良好的构建结果缓存。
  • stamp = -1:build 信息的嵌入由 --[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 插件的 IDE API,或适用于在标准 JDK 上运行的任何插件的 tools.jar
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 规则构建的 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 文件复制或链接到 runfiles 区域。

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,则并非如此。

摘要:如果规则 X 之间存在以 deps 边缘开头,后跟零个或多个 exports 边缘的依赖关系路径,则规则 X 可以访问 Y 中的代码。下面我们通过一些示例来说明一下这一点。

假设 A 依赖于 B,B 依赖于 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',则 A 只能访问 C',而无法访问 D'。

重要提示:导出的规则不是常规依赖项。继续以前面的示例为例,如果 B 导出 C 并且也想使用 C,它还必须在自己的 deps 中将其列出。

javacopts

List of strings; optional

此库的额外编译器选项。 可以使用“Make 变量”替换和 Bourne shell 令牌化

这些编译器选项在全局编译器选项之后传递给 javac。

Boolean; optional; default is False

此库是否仅用于编译而不用于运行时。 如果库将在执行期间由运行时环境提供,则此属性非常有用。此类库的示例包括适用于 IDE 插件的 IDE API,或适用于在标准 JDK 上运行的任何插件的 tools.jar

请注意,在 Java 语言规范(例如neverlink = 1String 或基元类型的 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 shell 令牌化

这些编译器选项在全局编译器选项之后传递给 javac。

jvm_flags

List of strings; optional

要嵌入为运行此二进制文件而生成的封装容器脚本中的标志列表。支持使用 $(location)“Make 变量”替换,以及 Bourne shell 标记化

Java 二进制文件的封装容器脚本包含 CLASSPATH 定义(以查找所有依赖的 jar),并调用正确的 Java 解释器。封装容器脚本生成的命令行包含主类的名称,后跟 "$@",因此您可以在类名称后面传递其他参数。但是,在命令行中,必须在类名称之前指定用于 JVM 解析的参数。jvm_flags 的内容会先添加到封装容器脚本中,再列出类名称。

请注意,此属性对 *_deploy.jar 输出没有影响

launcher

Label; optional

指定将用于运行 Java 程序(而非 JDK 附带的常规 bin/java 程序)的二进制文件。目标必须是 cc_binary。可以将实现 Java Invocation API 的任何 cc_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

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

是否将 build 信息编码到二进制文件中。可能的值包括:
  • stamp = 1:始终将 build 信息压印到二进制文件中,即使在 --nostamp build 中也是如此。应避免此设置,因为它可能会终止对该二进制文件的远程缓存以及依赖于该二进制文件的任何下游操作。
  • stamp = 0:始终用常量值替换 build 信息。这样可以提供良好的构建结果缓存。
  • stamp = -1:build 信息的嵌入由 --[no]stamp 标志控制。

带时间戳的二进制文件不会重新构建,除非其依赖项发生更改。

test_class

String; optional

将由测试运行程序加载的 Java 类。

默认情况下,如果未定义此参数,则系统会使用旧模式并改用测试参数。将 --nolegacy_bazel_java_test 标志设置为不在第一个参数上回退。

此属性用于指定此测试要运行的 Java 类的名称。很少需要设置该属性。如果省略此参数,系统将使用目标的 name 及其“来源-根”相对路径推断出此参数。如果测试位于已知来源根目录之外,则 Bazel 会在 test_class 未设置的情况下报告错误。

对于 JUnit3,测试类必须是 junit.framework.TestCase 的子类,或者必须具有返回 junit.framework.Test 的公共静态 suite() 方法(或 Test 的子类)。对于 JUnit4,该类需要带有 org.junit.runner.RunWith 注解。

此属性允许多条 java_test 规则共享同一个 TestTestCaseTestSuite...)。通常,系统会向它传递额外的信息(例如通过 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 归档。

除了添加了 processor_class 参数之外,其他参数与 java_library 相同。

参数

属性
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 文件复制或链接到 runfiles 区域。

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 生成注解处理器,则依赖于该规则的其他规则只有在其编译操作安排在生成规则之后才能引用生成的代码。启用 --java_header_compilation 时,此属性会指示 Bazel 引入调度限制。

警告:此属性会影响构建性能,请仅在必要时使用。

javacopts

List of strings; optional

此库的额外编译器选项。 可以使用“Make 变量”替换和 Bourne shell 令牌化

这些编译器选项在全局编译器选项之后传递给 javac。

Boolean; optional; default is False

此库是否仅用于编译而不用于运行时。 如果库将在执行期间由运行时环境提供,则此属性非常有用。此类库的示例包括适用于 IDE 插件的 IDE API,或适用于在标准 JDK 上运行的任何插件的 tools.jar

请注意,在 Java 语言规范(例如neverlink = 1String 或基元类型的 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 中可用于标签扩展的工具的标签。
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_compilation,以在不支持头文件编译的平台上停用头文件编译,例如 JDK 7 Bazel。
genclass

List of labels; required

GenClass 部署 jar 的标签。
header_compiler

List of labels; optional

标头编译器的标签。如果启用了 --java_header_compilation,则必需。
header_compiler_direct

List of labels; optional

标头编译器的可选标签,用于不包含任何生成 API 的注解处理器的直接类路径操作。

此工具不支持注释处理。

ijar

List of labels; required

ijar 可执行文件的标签。
jacocorunner

Label; optional

JacoCoverageRunner 部署 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 中可用于标签扩展的数据标签。
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”)。它指定 Java 源代码中允许使用哪组代码结构。
target_version

String; optional

Java 目标版本(例如,“6”或“7”)。它用于指定应为哪个 Java 运行时构建该类。
timezone_data

Label; optional

包含时区数据的资源 jar 的标签。如果设置了此参数,则时区数据会作为所有 java_binary 规则的隐式运行时依赖项进行添加。
tools

List of labels; optional

jvm_opts 中可用于标签扩展的工具的标签。
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 文档。