Java 规则

报告问题 查看源代码 每晚 · 7.2。 · 7.1。 · 7.0 · 6.5。 · 6.4

规则

java_binary

<ph type="x-smartling-placeholder"></ph> 查看规则来源
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 脚本使用的类路径包括每个 这个二进制文件所依赖的库运行封装容器 Shell 脚本时,任何非空值 JAVABIN 环境变量优先于通过 Bazel 的 --java_runtime_version 标志。

封装容器脚本接受多个唯一的标志。请参阅 //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。

    如果您的目标指定了启动器 属性,那么 _deploy.jar 将不再是普通的 JAR 文件 原生二进制文件。该文件将包含启动器以及 所有规则都链接到一个静态二进制文件实际 jar 文件的字节数为 附加到该原生二进制文件,从而创建一个包含 可执行文件和 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

姓名;必需

此目标的唯一名称。


最好使用源文件的名称,该文件是 应用(去掉扩展名)。例如,如果您的入口点称为 Main.java,那么您的名称可以是 Main
deps

标签列表;默认值为 []

要链接到目标的其他库的列表。 查看有关 deps 的一般评论: 由 大多数构建规则
srcs

标签列表;默认值为 []

为创建目标而处理的源文件列表。 此属性几乎总是必需属性,请参阅下方的例外情况。

系统会编译 .java 类型的源文件。如果生成的 .java 文件中,通常建议输入生成规则的名称 而不是文件本身的名称这不仅能提高可读性 如果生成的规则生成了 以后,您只需修正一个位置:outs 生成规则。您不应在 deps 中列出生成规则 因为它是空操作。

系统会解压缩并编译 .srcjar 类型的源文件。(如果 您需要使用 Genrule 来生成一组 .java 文件。)

规则:如果规则(通常为 genrulefilegroup)生成 上述任何文件,其使用方式与 文件。

该参数几乎总是必填,除非是 main_class 属性指定 类,或者指定 runtime_deps 参数。

resources

标签列表;默认值为 []

要包含在 Java jar 中的数据文件的列表。

如果指定了资源,这些资源将与常规资源一起打包到 jar 中, 编译生成的 .class 文件。内部资源的位置 取决于项目结构Bazel 首先会查找 标准目录布局, (“src”目录后跟“resources”目录孙级)。如果 则 Bazel 会查找名为“java”的最顶层目录或“javatests”(因此,对于 例如,如果资源位于 <workspace root>/x/java/y/java/z,则 该资源的路径将为 y/java/z。这种启发式方法不可替换, 不过,resource_strip_prefix 属性可用于指定 用于存放资源文件的特定备用目录

资源可以是源文件或生成的文件。

classpath_resources

标签列表;默认值为 []

请勿使用此选项,除非没有其他方式)

必须位于 java 树的根目录下的资源列表。该属性的 只是为了支持要求其资源 在类路径中找到的正好为 "myconfig.xml"。只能在 因为存在命名空间冲突的风险。

create_executable

Boolean;不可配置;默认值为 True

已弃用,请改用 java_single_jar
deploy_env

标签列表;默认值为 []

其他 java_binary 目标的列表,这些目标代表部署 此二进制文件的环境。 请在构建将由另一个插件加载的插件时设置此属性 java_binary
设置此属性可排除以下对象的所有依赖项: 此二进制文件的运行时类路径(和部署 jar) 二进制文件和 deploy_env 中指定的目标。
deploy_manifest_lines

字符串列表;默认值为 []

需要添加到 META-INF/manifest.mf 文件中的行列表,该文件是为 *_deploy.jar目标。此属性的内容不是主题 进行变量替换。
javacopts

字符串列表;默认值为 []

此库的额外编译器选项。 需遵循 "Make variable" 替换和 Bourne shell 令牌化

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

jvm_flags

字符串列表;默认值为 []

为了运行此二进制文件而生成的一系列要嵌入的封装容器脚本中的标志。 遵守$(location)创建变量" 替换以及 Bourne shell 令牌化

Java 二进制文件的封装容器脚本包含类路径定义 (查找所有相关的 jar)并调用正确的 Java 解释器。 由封装容器脚本生成的命令行包含 主类,后跟 "$@",这样您就可以传递其他 参数。不过, 行。jvm_flags 的内容会添加到封装容器中 脚本。

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

launcher

标签;默认值为 None

指定用于运行 Java 程序的二进制文件,而不是 JDK 中包含的普通 bin/java 程序。 目标必须是 cc_binary。符合以下条件的任何 cc_binary: 实现了 <ph type="x-smartling-placeholder"></ph> 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 属性。在此示例中 链接器将从生成的二进制文件中移除其认为未使用的任何代码, 也就是说,除非 cc_library 目标指定 alwayslink = 1

使用除默认 JDK 启动器之外的任何启动器时,格式 *_deploy.jar 输出的变化。查看主要版本 如需了解详情,请参阅 java_binary 文档。

main_class

String;默认值为 ""

具有 main() 方法且要用作入口点的类的名称。 如果规则使用此选项,则无需 srcs=[...] 列表。 因此,通过此属性,用户可通过已 包含一个或多个 main() 方法。

此属性的值是类名称,而不是源文件。该类必须是 在运行时可用:可以按此规则(来自 srcs)进行编译,或者 由直接或传递依赖项提供(通过 runtime_depsdeps)。如果该类不可用,二进制文件将在运行时失败;那里 并非构建时检查

plugins

标签列表;默认值为 []

在编译时运行的 Java 编译器插件。 每当此规则时,此属性中指定的每个java_plugin都会执行 。库还可以从使用 exported_plugins。资源 将包含在此规则的 jar 中。
resource_jars

标签列表;默认值为 []

已弃用:请改用 java_import 和 deps 或 runtime_deps。
resource_strip_prefix

String;默认值为 ""

要从 Java 资源中删除的路径前缀。

如果指定,则系统会从 resources 中的每个文件中删除此路径前缀 属性。资源文件不在此目录下会出错。如果不是 则资源文件的路径取决于 作为源文件的 Java 软件包。例如,位于 stuff/java/foo/bar/a.txt 将位于 foo/bar/a.txt

runtime_deps

标签列表;默认值为 []

供最终二进制文件使用或仅在运行时进行测试的库。 与普通的 deps 一样,它们会显示在运行时类路径中,但与 它们不在编译时类路径中。只在运行时需要的依赖项应为 此处列出。依赖项分析工具应忽略同时出现在 runtime_depsdeps
stamp

Integer;默认值为 -1

是否将 build 信息编码到二进制文件中。可能的值: <ph type="x-smartling-placeholder">
    </ph>
  • stamp = 1:始终将 build 信息标记到二进制文件中,即使在 --nostamp build。 应避免使用,因为这可能会终止 二进制文件以及依赖于它的任何下游操作。
  • stamp = 0:始终用常量值替换 build 信息。这个 提供良好的构建结果缓存。
  • stamp = -1:build 信息的嵌入由 --[no]stamp 标志。

除非其依赖项发生变化,否则带时间戳的二进制文件不会被重新构建。

use_launcher

Boolean;默认值为 True

二进制文件是否应使用自定义启动器。

如果将该属性设置为 false, launcher 属性以及相关的 --java_launcher 标志 将针对此定位条件忽略。

use_testrunner

Boolean;默认值为 False

使用测试运行程序(默认情况下) com.google.testing.junit.runner.BazelTestRunner) 类作为 Java 程序的主入口点,并提供测试类 作为 bazel.test_suite 的值提供给测试运行程序 系统属性。 您可以使用此属性来覆盖默认值, 即使用测试运行程序 java_test 条规则, 不将其用于 java_binary 规则。不太可能 您需要执行的操作一种用途是AllTest 由另一个规则调用的规则(用于设置数据库) )。AllTest 规则必须声明为 java_binary,但应 仍然使用测试运行程序作为其主入口点。 测试运行程序类的名称可以替换为 main_class 属性。

java_import

<ph type="x-smartling-placeholder"></ph> 查看规则来源
java_import(name, deps, data, add_exports, add_opens, 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, toolchains, 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

姓名;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

要链接到目标的其他库的列表。 请参阅 java_library.deps
data

标签列表;默认值为 []

此规则在运行时所需的文件列表。
add_exports

字符串列表;默认值为 []

允许此库访问指定的 modulepackage

这对应于 javac 和 JVM --add-exports= 标记。

add_opens

字符串列表;默认值为 []

允许此库反射地访问指定的 modulepackage

这对应于 javac 和 JVM --add-opens= 标记。

constraints

字符串列表;默认值为 []

作为 Java 库对此规则施加的额外约束。
exports

标签列表;默认值为 []

可供此规则用户使用的目标。 请参阅 java_library.exports
jars

标签列表;必需

提供给依赖于此目标的 Java 目标的 JAR 文件列表。

Boolean;默认值为 False

请仅将此库用于编译,不要在运行时使用。 如果库将由运行时环境提供,则此选项很有用 。此类库的示例包括 IDE API 对于 IDE 插件或 tools.jar(对于 标准 JDK
proguard_specs

标签列表;默认值为 []

用作 Proguard 规范的文件。 这些将描述 Proguard 使用的一组规范。如果已指定, 它们会添加到依赖于此库的任何 android_binary 目标中。 此处包含的文件只能具有幂等规则,即 -dontnote、-dontwarn、 以及以 -keep 开头的规则。其他选项只能显示在 android_binary 的 proguard_specs,旨在确保非同义合并。
runtime_deps

标签列表;默认值为 []

供最终二进制文件使用或仅在运行时进行测试的库。 请参阅 java_library.runtime_deps
srcjar

标签;默认值为 None

一个 JAR 文件,其中包含已编译的 JAR 文件的源代码。

java_library

<ph type="x-smartling-placeholder"></ph> 查看规则来源
java_library(name, deps, srcs, data, resources, add_exports, add_opens, bootclasspath, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exported_plugins, exports, features, javabuilder_jvm_flags, javacopts, licenses, neverlink, plugins, proguard_specs, resource_strip_prefix, restricted_to, runtime_deps, tags, target_compatible_with, testonly, toolchains, visibility)

此规则会将源代码编译并关联到 .jar 文件中。

隐式输出

  • libname.jar:包含类文件的 Java 归档。
  • libname-src.jar:包含来源(“来源”)的归档 jar”)。

参数

属性
name

姓名;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

要关联到此库的库列表。 查看有关 deps 的一般评论: 由 大多数构建规则

根据 deps 中列出的 java_library 规则构建的 jar 将 此规则的编译时类路径。此外,它们的传递闭包 depsruntime_depsexports将会参加 运行时类路径。

相比之下,data 属性中的目标包含在 runfile 中,但 无论是编译时类路径还是运行时类路径

srcs

标签列表;默认值为 []

为创建目标而处理的源文件列表。 此属性几乎总是必需属性,请参阅下方的例外情况。

系统会编译 .java 类型的源文件。如果生成的 .java 文件中,通常建议输入生成规则的名称 而不是文件本身的名称这不仅能提高可读性 如果生成的规则生成了 以后,您只需修正一个位置:outs 生成规则。您不应在 deps 中列出生成规则 因为它是空操作。

系统会解压缩并编译 .srcjar 类型的源文件。(如果 您需要使用 Genrule 来生成一组 .java 文件。)

规则:如果规则(通常为 genrulefilegroup)生成 上述任何文件,其使用方式与 文件。

.properties 类型的源文件被视为资源。

系统会忽略其他所有文件,但前提是这些文件中至少有一个 文件类型。否则,将引发错误。

除非您指定 runtime_deps 参数,否则几乎总是需要此参数。

data

标签列表;默认值为 []

此库在运行时所需的文件列表。 查看有关 data 的一般评论: 由 大多数构建规则

构建 java_library 时,Bazel 不会将这些文件放在任何位置;如果 data 文件是生成的文件,然后 Bazel 会生成它们。在构建 依赖于此映像的测试java_libraryBazel 会复制或关联 将 data 文件复制到 runfiles 区域。

resources

标签列表;默认值为 []

要包含在 Java jar 中的数据文件的列表。

资源可以是源文件或生成的文件。

如果指定了资源,这些资源将与常规资源一起打包到 jar 中, 编译生成的 .class 文件。内部资源的位置 取决于项目结构Bazel 首先会查找 标准目录布局, (“src”目录后跟“resources”目录孙级)。如果 则 Bazel 会查找名为“java”的最顶层目录或“javatests”(因此,对于 例如,如果资源位于 <workspace root>/x/java/y/java/z,则 该资源的路径将为 y/java/z。这种启发式方法不可替换, 不过,resource_strip_prefix 属性可用于指定 用于存放资源文件的特定备用目录

add_exports

字符串列表;默认值为 []

允许此库访问指定的 modulepackage

这对应于 javac 和 JVM --add-exports= 标记。

add_opens

字符串列表;默认值为 []

允许此库反射地访问指定的 modulepackage

这对应于 javac 和 JVM --add-opens= 标记。

bootclasspath

标签;默认值为 None

该 API 是受限的,请勿使用!
exported_plugins

标签列表;默认值为 []

java_plugin 列表(例如,注解) 处理器)导出到直接依赖于此库的库。

指定的 java_plugin 列表将应用于任何符合以下条件的库: 直接依赖于此库,就好比该库 plugins 中的标签。

exports

标签列表;默认值为 []

导出的库。

此处的列出规则会将其提供给父级规则,就好像父级规则 都取决于这些规则这不适用于常规(未导出的)deps

摘要:如果存在依赖项,则规则 X 可以访问 Y 中的代码XX 它们之间的路径,以 deps 边线开头,后跟零个或更多边 exports 条边。我们来看一些示例来对此进行说明。

假设 A 依赖于 B,B 依赖于 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 导出了一些库,C'和 D' A 只能访问 C”而不是“D”。

重要提示:导出的规则不是常规依赖项。仍以上一个示例为例 如果 B 导出 C 并且还想使用 C,则必须在单独的列表中列出 deps

javabuilder_jvm_flags

字符串列表;默认值为 []

该 API 是受限的,请勿使用!
javacopts

字符串列表;默认值为 []

此库的额外编译器选项。 需遵循 "Make variable" 替换和 Bourne shell 令牌化

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

Boolean;默认值为 False

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

请注意,neverlink = 1 不会阻止编译器内嵌内容 从此库转换为依赖于它的编译目标,这是 Java 允许的 语言规范(例如,Stringstatic final 常量 或基元类型)。因此,首选用例是 与编译库完全相同。

如果运行时库与编译库不同,则您必须确保它 区别仅在于 JLS 禁止编译器内联的地方(并且必须 JLS 的所有未来版本)。

plugins

标签列表;默认值为 []

在编译时运行的 Java 编译器插件。 每当此规则时,此属性中指定的每个java_plugin都会执行 。库还可以从使用 exported_plugins。资源 将包含在此规则的 jar 中。
proguard_specs

标签列表;默认值为 []

用作 Proguard 规范的文件。 这些将描述 Proguard 使用的一组规范。如果已指定, 它们会添加到依赖于此库的任何 android_binary 目标中。 此处包含的文件只能具有幂等规则,即 -dontnote、-dontwarn、 以及以 -keep 开头的规则。其他选项只能显示在 android_binary 的 proguard_specs,旨在确保非同义合并。
resource_strip_prefix

String;默认值为 ""

要从 Java 资源中删除的路径前缀。

如果指定,则系统会从 resources 中的每个文件中删除此路径前缀 属性。资源文件不在此目录下会出错。如果不是 则资源文件的路径取决于 作为源文件的 Java 软件包。例如,位于 stuff/java/foo/bar/a.txt 将位于 foo/bar/a.txt

runtime_deps

标签列表;默认值为 []

供最终二进制文件使用或仅在运行时进行测试的库。 与普通的 deps 一样,它们会显示在运行时类路径中,但与 它们不在编译时类路径中。只在运行时需要的依赖项应为 此处列出。依赖项分析工具应忽略同时出现在 runtime_depsdeps

java_lite_proto_library

<ph type="x-smartling-placeholder"></ph> 查看规则来源
java_lite_proto_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

java_lite_proto_library.proto 文件生成 Java 代码。

deps 必须指向 proto_library 规则。

示例:


java_library(
    name = "lib",
    runtime_deps = [":foo"],
)

java_lite_proto_library(
    name = "foo",
    deps = [":bar"],
)

proto_library(
    name = "bar",
)

参数

属性
name

姓名;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

proto_library 的列表 为其生成 Java 代码的规则。

java_proto_library

<ph type="x-smartling-placeholder"></ph> 查看规则来源
java_proto_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

java_proto_library.proto 文件生成 Java 代码。

deps 必须指向 proto_library 规则。

示例:


java_library(
    name = "lib",
    runtime_deps = [":foo_java_proto"],
)

java_proto_library(
    name = "foo_java_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

参数

属性
name

姓名;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

proto_library 的列表 为其生成 Java 代码的规则。

java_test

<ph type="x-smartling-placeholder"></ph> 查看规则来源
java_test(name, deps, srcs, data, resources, add_exports, add_opens, args, bootclasspath, 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, neverlink, plugins, 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

姓名;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

要链接到目标的其他库的列表。 查看有关 deps 的一般评论: 由 大多数构建规则
srcs

标签列表;默认值为 []

为创建目标而处理的源文件列表。 此属性几乎总是必需属性,请参阅下方的例外情况。

系统会编译 .java 类型的源文件。如果生成的 .java 文件中,通常建议输入生成规则的名称 而不是文件本身的名称这不仅能提高可读性 如果生成的规则生成了 以后,您只需修正一个位置:outs 生成规则。您不应在 deps 中列出生成规则 因为它是空操作。

系统会解压缩并编译 .srcjar 类型的源文件。(如果 您需要使用 Genrule 来生成一组 .java 文件。)

规则:如果规则(通常为 genrulefilegroup)生成 上述任何文件,其使用方式与 文件。

该参数几乎总是必填,除非是 main_class 属性指定 类,或者指定 runtime_deps 参数。

data

标签列表;默认值为 []

此库在运行时所需的文件列表。 查看关于 data 的一般评论 大多数构建规则
resources

标签列表;默认值为 []

要包含在 Java jar 中的数据文件的列表。

资源可以是源文件或生成的文件。

如果指定了资源,这些资源将与常规资源一起打包到 jar 中, 编译生成的 .class 文件。内部资源的位置 取决于项目结构Bazel 首先会查找 标准目录布局, (“src”目录后跟“resources”目录孙级)。如果 则 Bazel 会查找名为“java”的最顶层目录或“javatests”(因此,对于 例如,如果资源位于 <workspace root>/x/java/y/java/z,则 该资源的路径将为 y/java/z。这种启发式方法不可替换, 不过,resource_strip_prefix 属性可用于指定 用于存放资源文件的特定备用目录

add_exports

字符串列表;默认值为 []

允许此库访问指定的 modulepackage

这对应于 javac 和 JVM --add-exports= 标记。

add_opens

字符串列表;默认值为 []

允许此库反射地访问指定的 modulepackage

这对应于 javac 和 JVM --add-opens= 标记。

bootclasspath

标签;默认值为 None

该 API 是受限的,请勿使用!
classpath_resources

标签列表;默认值为 []

请勿使用此选项,除非没有其他方式)

必须位于 java 树的根目录下的资源列表。该属性的 只是为了支持要求其资源 在类路径中找到的正好为 "myconfig.xml"。只能在 因为存在命名空间冲突的风险。

create_executable

Boolean;默认值为 True

已弃用,请改用 java_single_jar
deploy_manifest_lines

字符串列表;默认值为 []

需要添加到 META-INF/manifest.mf 文件中的行列表,该文件是为 *_deploy.jar目标。此属性的内容不是主题 进行变量替换。
javacopts

字符串列表;默认值为 []

此二进制文件的其他编译器选项。 需遵循 "Make variable" 替换和 Bourne shell 令牌化

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

jvm_flags

字符串列表;默认值为 []

为了运行此二进制文件而生成的一系列要嵌入的封装容器脚本中的标志。 遵守$(location)创建变量" 替换以及 Bourne shell 令牌化

Java 二进制文件的封装容器脚本包含类路径定义 (查找所有相关的 jar)并调用正确的 Java 解释器。 由封装容器脚本生成的命令行包含 主类,后跟 "$@",这样您就可以传递其他 参数。不过, 行。jvm_flags 的内容会添加到封装容器中 脚本。

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

launcher

标签;默认值为 None

指定用于运行 Java 程序的二进制文件,而不是 JDK 中包含的普通 bin/java 程序。 目标必须是 cc_binary。符合以下条件的任何 cc_binary: 实现了 <ph type="x-smartling-placeholder"></ph> 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 属性。在此示例中 链接器将从生成的二进制文件中移除其认为未使用的任何代码, 也就是说,除非 cc_library 目标指定 alwayslink = 1

使用除默认 JDK 启动器之外的任何启动器时,格式 *_deploy.jar 输出的变化。查看主要版本 如需了解详情,请参阅 java_binary 文档。

main_class

String;默认值为 ""

具有 main() 方法且要用作入口点的类的名称。 如果规则使用此选项,则无需 srcs=[...] 列表。 因此,通过此属性,用户可通过已 包含一个或多个 main() 方法。

此属性的值是类名称,而不是源文件。该类必须是 在运行时可用:可以按此规则(来自 srcs)进行编译,或者 由直接或传递依赖项提供(通过 runtime_depsdeps)。如果该类不可用,二进制文件将在运行时失败;那里 并非构建时检查

Boolean;默认值为 False

plugins

标签列表;默认值为 []

在编译时运行的 Java 编译器插件。 每当此规则时,此属性中指定的每个java_plugin都会执行 。库还可以从使用 exported_plugins。资源 将包含在此规则的 jar 中。
resource_strip_prefix

String;默认值为 ""

要从 Java 资源中删除的路径前缀。

如果指定,则系统会从 resources 中的每个文件中删除此路径前缀 属性。资源文件不在此目录下会出错。如果不是 则资源文件的路径取决于 作为源文件的 Java 软件包。例如,位于 stuff/java/foo/bar/a.txt 将位于 foo/bar/a.txt

runtime_deps

标签列表;默认值为 []

供最终二进制文件使用或仅在运行时进行测试的库。 与普通的 deps 一样,它们会显示在运行时类路径中,但与 它们不在编译时类路径中。只在运行时需要的依赖项应为 此处列出。依赖项分析工具应忽略同时出现在 runtime_depsdeps
stamp

Integer;默认值为 0

是否将 build 信息编码到二进制文件中。可能的值: <ph type="x-smartling-placeholder">
    </ph>
  • stamp = 1:始终将 build 信息标记到二进制文件中,即使在 --nostamp build。 应避免使用,因为这可能会终止 二进制文件以及依赖于它的任何下游操作。
  • stamp = 0:始终用常量值替换 build 信息。这个 提供良好的构建结果缓存。
  • stamp = -1:build 信息的嵌入由 --[no]stamp 标志。

除非其依赖项发生变化,否则带时间戳的二进制文件不会被重新构建。

test_class

String;默认值为 ""

测试运行程序要加载的 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 规则 共享相同的TestTestCaseTestSuite...)。一般价格 向它传递额外的信息, (例如,通过 jvm_flags=['-Dkey=value']),使其 例如运行不同的 部分测试。通过此属性,您还可以使用 在 javatests 树之外进行 Java 测试。

use_launcher

Boolean;默认值为 True

二进制文件是否应使用自定义启动器。

如果将该属性设置为 false, launcher 属性以及相关的 --java_launcher 标志 将针对此定位条件忽略。

use_testrunner

Boolean;默认值为 True

使用测试运行程序(默认情况下) com.google.testing.junit.runner.BazelTestRunner) 类作为 Java 程序的主入口点,并提供测试类 作为 bazel.test_suite 的值提供给测试运行程序 系统属性。
您可以使用此属性来覆盖默认值, 即使用测试运行程序 java_test 条规则, 且不将其用于 java_binary 规则。不太可能 您需要执行的操作一种用途是AllTest 由另一个规则调用的规则(用于设置数据库) )。AllTest 规则必须声明为 java_binary,但应 仍然使用测试运行程序作为其主入口点。 测试运行程序类的名称可以替换为 main_class 属性。

java_package_configuration

<ph type="x-smartling-placeholder"></ph> 查看规则来源
java_package_configuration(name, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, javacopts, output_licenses, packages, restricted_to, tags, target_compatible_with, testonly, toolchains, 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

字符串列表;默认值为 []

Java 编译器标志。
output_licenses

字符串列表;默认值为 []

packages

标签列表;默认值为 []

package_group 的集合 应用该配置。

java_plugin

<ph type="x-smartling-placeholder"></ph> 查看规则来源
java_plugin(name, deps, srcs, data, resources, add_exports, add_opens, bootclasspath, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, generates_api, javabuilder_jvm_flags, javacopts, licenses, neverlink, output_licenses, plugins, processor_class, proguard_specs, resource_strip_prefix, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

java_plugin 为 Bazel 运行的 Java 编译器定义插件。通过 只有注解处理器才是受支持的插件类型。java_libraryjava_binary 规则可以通过 plugins 运行插件, 属性。java_library 还可以自动将插件导出到 直接依赖于它 exported_plugins

隐式输出目标

  • libname.jar:Java 归档。

除了以下差异,参数与 java_library 完全相同: 添加 processor_class 参数。

参数

属性
name

姓名;必需

此目标的唯一名称。

deps

标签列表;默认值为 []

要关联到此库的库列表。 查看有关 deps 的一般评论: 由 大多数构建规则

根据 deps 中列出的 java_library 规则构建的 jar 将 此规则的编译时类路径。此外,它们的传递闭包 depsruntime_depsexports将会参加 运行时类路径。

相比之下,data 属性中的目标包含在 runfile 中,但 无论是编译时类路径还是运行时类路径

srcs

标签列表;默认值为 []

为创建目标而处理的源文件列表。 此属性几乎总是必需属性,请参阅下方的例外情况。

系统会编译 .java 类型的源文件。如果生成的 .java 文件中,通常建议输入生成规则的名称 而不是文件本身的名称这不仅能提高可读性 如果生成的规则生成了 以后,您只需修正一个位置:outs 生成规则。您不应在 deps 中列出生成规则 因为它是空操作。

系统会解压缩并编译 .srcjar 类型的源文件。(如果 您需要使用 Genrule 来生成一组 .java 文件。)

规则:如果规则(通常为 genrulefilegroup)生成 上述任何文件,其使用方式与 文件。

.properties 类型的源文件被视为资源。

系统会忽略其他所有文件,但前提是这些文件中至少有一个 文件类型。否则,将引发错误。

除非您指定 runtime_deps 参数,否则几乎总是需要此参数。

data

标签列表;默认值为 []

此库在运行时所需的文件列表。 查看有关 data 的一般评论: 由 大多数构建规则

构建 java_library 时,Bazel 不会将这些文件放在任何位置;如果 data 文件是生成的文件,然后 Bazel 会生成它们。在构建 依赖于此映像的测试java_libraryBazel 会复制或关联 将 data 文件复制到 runfiles 区域。

resources

标签列表;默认值为 []

要包含在 Java jar 中的数据文件的列表。

资源可以是源文件或生成的文件。

如果指定了资源,这些资源将与常规资源一起打包到 jar 中, 编译生成的 .class 文件。内部资源的位置 取决于项目结构Bazel 首先会查找 标准目录布局, (“src”目录后跟“resources”目录孙级)。如果 则 Bazel 会查找名为“java”的最顶层目录或“javatests”(因此,对于 例如,如果资源位于 <workspace root>/x/java/y/java/z,则 该资源的路径将为 y/java/z。这种启发式方法不可替换, 不过,resource_strip_prefix 属性可用于指定 用于存放资源文件的特定备用目录

add_exports

字符串列表;默认值为 []

允许此库访问指定的 modulepackage

这对应于 javac 和 JVM --add-exports= 标记。

add_opens

字符串列表;默认值为 []

允许此库反射地访问指定的 modulepackage

这对应于 javac 和 JVM --add-opens= 标记。

bootclasspath

标签;默认值为 None

该 API 是受限的,请勿使用!
generates_api

Boolean;默认值为 False

此属性用于标记生成 API 代码的注解处理器。

如果规则使用 API 生成注释处理器,则其他规则 其依赖项只有在生成的代码 编译操作安排在生成规则之后。这个 属性指示 Bazel,在以下情况下引入调度约束: --java_header_compile 已启用。

警告:此属性会影响 build 请仅在必要时使用。

javabuilder_jvm_flags

字符串列表;默认值为 []

该 API 是受限的,请勿使用!
javacopts

字符串列表;默认值为 []

此库的额外编译器选项。 需遵循 "Make variable" 替换和 Bourne shell 令牌化

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

Boolean;默认值为 False

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

请注意,neverlink = 1 不会阻止编译器内嵌内容 从此库转换为依赖于它的编译目标,这是 Java 允许的 语言规范(例如,Stringstatic final 常量 或基元类型)。因此,首选用例是 与编译库完全相同。

如果运行时库与编译库不同,则您必须确保它 区别仅在于 JLS 禁止编译器内联的地方(并且必须 JLS 的所有未来版本)。

output_licenses

字符串列表;默认值为 []

plugins

标签列表;默认值为 []

在编译时运行的 Java 编译器插件。 每当此规则时,此属性中指定的每个java_plugin都会执行 。库还可以从使用 exported_plugins。资源 将包含在此规则的 jar 中。
processor_class

String;默认值为 ""

处理器类是 Java 编译器应采用的类的完全限定类型 用作注解处理器的入口点。如果未指定,则此规则不会 用于为 Java 编译器的注解处理贡献注解处理器,但其 运行时类路径仍将包含在编译器的注解处理器路径中。( 主要供 已加载的 Error Prone 插件 使用 java.util.ServiceLoader.)
proguard_specs

标签列表;默认值为 []

用作 Proguard 规范的文件。 这些将描述 Proguard 使用的一组规范。如果已指定, 它们会添加到依赖于此库的任何 android_binary 目标中。 此处包含的文件只能具有幂等规则,即 -dontnote、-dontwarn、 以及以 -keep 开头的规则。其他选项只能显示在 android_binary 的 proguard_specs,旨在确保非同义合并。
resource_strip_prefix

String;默认值为 ""

要从 Java 资源中删除的路径前缀。

如果指定,则系统会从 resources 中的每个文件中删除此路径前缀 属性。资源文件不在此目录下会出错。如果不是 则资源文件的路径取决于 作为源文件的 Java 软件包。例如,位于 stuff/java/foo/bar/a.txt 将位于 foo/bar/a.txt

java_runtime

<ph type="x-smartling-placeholder"></ph> 查看规则来源
java_runtime(name, srcs, compatible_with, default_cds, deprecation, distribs, exec_compatible_with, exec_properties, features, hermetic_srcs, hermetic_static_libs, java, java_home, lib_ct_sym, lib_modules, output_licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, version, visibility)

指定 Java 运行时的配置。

示例:



java_runtime(
    name = "jdk-9-ea+153",
    srcs = glob(["jdk9-ea+153/**"]),
    java_home = "jdk9-ea+153",
)


参数

属性
name

姓名;必需

此目标的唯一名称。

srcs

标签列表;默认值为 []

运行时中的所有文件。
default_cds

标签;默认值为 None

封闭 java_runtime 的默认 CDS 归档。如果封闭 已针对 java_binary 目标启用,并且该目标没有: 提供自己的 CDS 归档,方法是指定 classlist 属性 java_runtime 默认 CDS 打包在封闭部署 JAR 中。
hermetic_srcs

标签列表;默认值为 []

运行时中封闭部署所需的文件。
hermetic_static_libs

标签列表;默认值为 []

与封闭部署的启动器静态关联的库
java

标签;默认值为 None

Java 可执行文件的路径。
java_home

String;默认值为 ""

运行时根目录的路径。 受“品牌”的约束变量替换。 如果此路径是绝对路径,则该规则表示具有已知 路径。在这种情况下,srcsjava 属性必须为空。
lib_ct_sym

标签;默认值为 None

使用 --release 编译所需的 lib/ct.sym 文件。如果未指定,并且 srcs 中只有一个文件,其路径结尾为 /lib/ct.sym,系统会使用该文件。
lib_modules

标签;默认值为 None

封闭部署所需的 lib/modules 文件。
output_licenses

字符串列表;默认值为 []

version

Integer;默认值为 0

Java 运行时的功能版本。也就是说, Runtime.version().feature()

java_toolchain

<ph type="x-smartling-placeholder"></ph> 查看规则来源
java_toolchain(name, android_lint_data, android_lint_jvm_opts, android_lint_opts, android_lint_package_configuration, android_lint_runner, bootclasspath, compatible_javacopts, compatible_with, deprecation, deps_checker, distribs, exec_compatible_with, exec_properties, features, forcibly_disable_header_compilation, genclass, header_compiler, header_compiler_builtin_processors, header_compiler_direct, ijar, jacocorunner, java_runtime, javabuilder, javabuilder_data, javabuilder_jvm_opts, javac_supports_multiplex_workers, javac_supports_worker_cancellation, javac_supports_worker_multiplex_sandboxing, javac_supports_workers, javacopts, jspecify_implicit_deps, jspecify_javacopts, jspecify_packages, jspecify_processor, jspecify_processor_class, jspecify_stubs, jvm_opts, licenses, misc, oneversion, oneversion_allowlist_for_tests, oneversion_whitelist, package_configuration, proguard_allowlister, reduced_classpath_incompatible_processors, restricted_to, singlejar, source_version, tags, target_compatible_with, target_version, testonly, timezone_data, toolchains, 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_jvm_opts

字符串列表;默认值为 []

调用 Android Lint 时 JVM 的参数列表。
android_lint_opts

字符串列表;默认值为 []

Android Lint 参数的列表。
android_lint_package_configuration

标签列表;默认值为 []

应应用于指定软件包组的 Android Lint 配置。
android_lint_runner

标签;默认值为 None

Android Lint 运行程序的标签(如果有)。
bootclasspath

标签列表;默认值为 []

Java 目标 bootclasspath 条目。对应于 javac 的 -bootclasspath 标志。
compatible_javacopts

null;默认值为 {}

内部 API,请勿使用!
deps_checker

标签;默认值为 None

ImportDepsChecker 部署 jar 的标签。
forcibly_disable_header_compilation

Boolean;默认值为 False

替换 --java_header_compile 以停用非编译和 支持它,例如JDK 7 Bazel。
genclass

标签;默认值为 None

GenClass 部署 jar 的标签。
header_compiler

标签;默认值为 None

标头编译器的标签。如果启用了 --java_header_编译,则为必需项。
header_compiler_builtin_processors

字符串列表;默认值为 []

内部 API,请勿使用!
header_compiler_direct

标签;默认值为 None

标头编译器的可选标签,用于 添加任何生成 API 的注解处理器。

此工具不支持注解处理。

ijar

标签;默认值为 None

ijar 可执行文件的标签。
jacocorunner

标签;默认值为 None

JacocoCoverageRunner 部署 jar 的标签。
java_runtime

标签;默认值为 None

与此工具链配合使用的 java_runtime。默认为 java_runtime 执行配置中。
javabuilder

标签;默认值为 None

JavaBuilder 部署 jar 的标签。
javabuilder_data

标签列表;默认值为 []

javabuilder_jvm_opts 中可用于标签扩展的数据的标签。
javabuilder_jvm_opts

字符串列表;默认值为 []

调用 JavaBuilder 时 JVM 的参数列表。
javac_supports_multiplex_workers

Boolean;默认值为 True

如果 JavaBuilder 支持作为多路复用持久性工作器运行,则为 true;如果不支持,则为 false。
javac_supports_worker_cancellation

Boolean;默认值为 True

如果 JavaBuilder 支持取消永久性工作器,则为 true,否则为 false。
javac_supports_worker_multiplex_sandboxing

Boolean;默认值为 False

如果 JavaBuilder 支持作为具有沙盒功能的多路复用持久性工作器运行,则为 true,否则为 false。
javac_supports_workers

Boolean;默认值为 True

如果 JavaBuilder 支持作为永久性工作器运行,则为 true;如果不支持,则为 false。
javacopts

字符串列表;默认值为 []

Java 编译器的额外参数列表。请参考 Java 编译器 文档。
jspecify_implicit_deps

标签;默认值为 None

实验性功能,请勿使用!
jspecify_javacopts

字符串列表;默认值为 []

实验性功能,请勿使用!
jspecify_packages

标签列表;默认值为 []

实验性功能,请勿使用!
jspecify_processor

标签;默认值为 None

实验性功能,请勿使用!
jspecify_processor_class

String;默认值为 ""

实验性功能,请勿使用!
jspecify_stubs

标签列表;默认值为 []

实验性功能,请勿使用!
jvm_opts

字符串列表;默认值为 []

调用 Java 编译器时 JVM 的参数列表。请参阅 Java 虚拟机文档。
misc

字符串列表;默认值为 []

已弃用:请改用 javacopts
oneversion

标签;默认值为 None

一个版本强制执行二进制文件的标签。
oneversion_allowlist_for_tests

标签;默认值为 None

用于测试的单一版本许可名单的标签。
oneversion_whitelist

标签;默认值为 None

单一版本许可名单的标签。
package_configuration

标签列表;默认值为 []

应应用于指定软件包组的配置。
proguard_allowlister

标签;默认值为 "@bazel_tools//tools/jdk:proguard_whitelister"

Proguard 许可名单器的标签。
reduced_classpath_incompatible_processors

字符串列表;默认值为 []

内部 API,请勿使用!
singlejar

标签;默认值为 None

SingleJar 部署 jar 的标签。
source_version

String;默认值为 ""

Java 源代码版本(例如,“6”或“7”)。它指定了 可以在 Java 源代码中使用。
target_version

String;默认值为 ""

Java 目标版本(例如,“6”或“7”)。它会指定该类针对哪个 Java 运行时 。
timezone_data

标签;默认值为 None

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

标签列表;默认值为 []

jvm_opts 中可用于标签扩展的工具的标签。
turbine_data

标签列表;默认值为 []

turbine_jvm_opts 中可用于标签扩展的数据的标签。
turbine_jvm_opts

字符串列表;默认值为 []

调用 Turbine 时 JVM 的参数列表。
xlint

字符串列表;默认值为 []

要在默认列表中添加或移除的警告列表。前面使用破折号 移除。如需了解详情,请参阅有关 -Xlint 选项的 Javac 文档。