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)
Builds a Java archive ("jar file"), plus a wrapper shell script with the same name as the rule. The wrapper shell script uses a classpath that includes, among other things, a jar file for each library on which the binary depends.
The wrapper script accepts several unique flags. Refer to//src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt for a list of configurable flags and environment variables accepted by the wrapper.
name.jar: A Java archive, containing the class files and other resources corresponding to the binary's direct dependencies.name-src.jar: An archive containing the sources ("source jar").name_deploy.jar: A Java archive suitable for deployment (only built if explicitly requested). Building the<name>_deploy.jar target for your rule creates a self-contained jar file with a manifest that allows it to be run with thejava -jar command or with the wrapper script's--singlejar option. Using the wrapper script is preferred tojava -jar because it also passes theJVM flags and the options to load native libraries.
The deploy jar contains all the classes that would be found by a classloader that searched the classpath from the binary's wrapper script from beginning to end. It also contains the native libraries needed for dependencies. These are automatically loaded into the JVM at runtime.
If your target specifies alauncher attribute, then instead of being a normal JAR file, the _deploy.jar will be a native binary. This will contain the launcher plus any native (C++) dependencies of your rule, all linked into a static binary. The actual jar file's bytes will be appended to that native binary, creating a single binary blob containing both the executable and the Java code. You can execute the resulting jar file directly like you would execute any native binary.
name_deploy-src.jar: An archive containing the sources collected from the transitive closure of the target. These will match the classes in thedeploy.jar except where jars have no matching source jar. Adeps attribute is not allowed in ajava_binary rule withoutsrcs; such a rule requires amain_class provided byruntime_deps.
The following code snippet illustrates a common mistake:
java_binary( name = "DontDoThis", srcs = [...,"GeneratedJavaFile.java", # a generated .java file ], deps = [":generating_rule",], # rule that generates that file)
Do this instead:
java_binary( name = "DoThisInstead", srcs = [..., ":generating_rule", ],)
| Attributes | |
|---|---|
name |
A unique name for this target. It is good practice to use the name of the source file that is the main entry point of the application (minus the extension). For example, if your entry point is called Main.java, then your name could beMain. |
deps |
deps atAttributes common to all build rules. |
srcs |
Source files of type Source files of type Rules: if the rule (typically This argument is almost always required, except if a |
resources |
If resources are specified, they will be bundled in the jar along with the usual Resources may be source files or generated files. |
classpath_resources |
A list of resources that must be located at the root of the java tree. This attribute's only purpose is to support third-party libraries that require that their resources be found on the classpath as exactly |
create_executable |
launcher ormain_class attributes are set. |
deploy_env |
java_binary targets which represent the deployment environment for this binary. Set this attribute when building a plugin which will be loaded by anotherjava_binary.Setting this attribute excludes all dependencies from the runtime classpath (and the deploy jar) of this binary that are shared between this binary and the targets specified in deploy_env. |
deploy_manifest_lines |
META-INF/manifest.mf file generated for the*_deploy.jar target. The contents of this attribute arenot subject to"Make variable" substitution. |
javacopts |
These compiler options are passed to javac after the global compiler options. |
jvm_flags |
The wrapper script for a Java binary includes a CLASSPATH definition (to find all the dependent jars) and invokes the right Java interpreter. The command line generated by the wrapper script includes the name of the main class followed by a Note that this attribute hasno effect on |
launcher |
bin/java program included with the JDK. The target must be acc_binary. Anycc_binary that implements the Java Invocation API can be specified as a value for this attribute.By default, Bazel will use the normal JDK launcher (bin/java or java.exe). The related Note that your native (C++, SWIG, JNI) dependencies will be built differently depending on whether you are using the JDK launcher or another launcher:
When using any launcher other than the default JDK launcher, the format of the |
main_class |
main() method to use as entry point. If a rule uses this option, it does not need asrcs=[...] list. Thus, with this attribute one can make an executable from a Java library that already contains one or moremain() methods. The value of this attribute is a class name, not a source file. The class must be available at runtime: it may be compiled by this rule (from |
plugins |
java_plugin specified in this attribute will be run whenever this rule is built. A library may also inherit plugins from dependencies that useexported_plugins. Resources generated by the plugin will be included in the resulting jar of this rule. |
resource_jars |
If specified, the contents of these jars are merged into the output jar. |
resource_strip_prefix |
If specified, this path prefix is stripped from every file in the |
runtime_deps |
deps, these will appear on the runtime classpath, but unlike them, not on the compile-time classpath. Dependencies needed only at runtime should be listed here. Dependency-analysis tools should ignore targets that appear in bothruntime_deps anddeps. |
stamp |
Stamped binaries arenot rebuilt unless their dependencies change. |
use_launcher |
If this attribute is set to false, thelauncher attribute and the related |
use_testrunner |
com.google.testing.junit.runner.BazelTestRunner) class as the main entry point for a Java program, and provide the test class to the test runner as a value ofbazel.test_suite system property. You can use this to override the default behavior, which is to use test runner forjava_test rules, and not use it forjava_binary rules. It is unlikely you will want to do this. One use is forAllTest rules that are invoked by another rule (to set up a database before running the tests, for example). TheAllTest rule must be declared as ajava_binary, but should still use the test runner as its main entry point. The name of a test runner class can be overridden withmain_class attribute. |
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)
This rule allows the use of precompiled.jar files as libraries forjava_library andjava_binary rules.
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", ], )
| Attributes | |
|---|---|
name |
A unique name for this target. |
deps |
|
constraints |
|
exports |
|
jars |
|
neverlink |
tools.jar for anything running on a standard JDK. |
proguard_specs |
android_binary target depending on this library. The files included here must only have idempotent rules, namely -dontnote, -dontwarn, assumenosideeffects, and rules that start with -keep. Other options can only appear inandroid_binary's proguard_specs, to ensure non-tautological merges. |
runtime_deps |
|
srcjar |
|
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)
This rule compiles and links sources into a.jar file.
libname.jar: A Java archive containing the class files.libname-src.jar: An archive containing the sources ("source jar").| Attributes | |
|---|---|
name |
A unique name for this target. |
deps |
deps atAttributes common to all build rules. The jars built by By contrast, targets in the |
srcs |
Source files of type Source files of type Rules: if the rule (typically This argument is almost always required, except if a |
data |
data atAttributes common to all build rules. When building a |
resources |
If resources are specified, they will be bundled in the jar along with the usual Resources may be source files or generated files. |
exported_plugins |
java_plugins (e.g. annotation processors) to export to libraries that directly depend on this library. The specified list of |
exports |
Listing rules here will make them available to parent rules, as if the parents explicitly depended on these rules. This is not true for regular (non-exported) Summary: a ruleX can access the code inY if there exists a dependency path between them that begins with a AssumeA depends onB andB depends onC. In this case C is atransitive dependency of A, so changing C's sources and rebuilding A will correctly rebuild everything. However A will not be able to use classes in C. To allow that, either A has to declare C in its The closure of exported libraries is available to all direct parent rules. Take a slightly different example: A depends on B, B depends on C and D, and also exports C but not D. Now A has access to C but not to D. Now, if C and D exported some libraries, C' and D' respectively, A could only access C' but not D'. Important: an exported rule is not a regular dependency. Sticking to the previous example, if B exports C and wants to also use C, it has to also list it in its own |
javacopts |
These compiler options are passed to javac after the global compiler options. |
neverlink |
tools.jar for anything running on a standard JDK. Note that If the runtime library differs from the compilation library then you must ensure that it differs only in places that the JLS forbids compilers to inline (and that must hold for all future versions of the JLS). |
plugins |
java_plugin specified in this attribute will be run whenever this rule is built. A library may also inherit plugins from dependencies that useexported_plugins. Resources generated by the plugin will be included in the resulting jar of this rule. |
proguard_specs |
android_binary target depending on this library. The files included here must only have idempotent rules, namely -dontnote, -dontwarn, assumenosideeffects, and rules that start with -keep. Other options can only appear inandroid_binary's proguard_specs, to ensure non-tautological merges. |
resource_jars |
If specified, the contents of these jars are merged into the output jar. |
resource_strip_prefix |
If specified, this path prefix is stripped from every file in the |
runtime_deps |
deps, these will appear on the runtime classpath, but unlike them, not on the compile-time classpath. Dependencies needed only at runtime should be listed here. Dependency-analysis tools should ignore targets that appear in bothruntime_deps anddeps. |
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 generates Java code from.proto files.
deps must point toproto_library rules.
Example:
java_library( name = "lib", deps = [":foo"],)java_lite_proto_library( name = "foo", deps = [":bar"],)proto_library( name = "bar",)
| Attributes | |
|---|---|
name |
A unique name for this target. |
deps |
proto_library rules to generate Java code for. |
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 generates Java code from.proto files.
deps must point toproto_library rules.
Example:
java_library( name = "lib", deps = [":foo_java_proto"],)java_proto_library( name = "foo_java_proto", deps = [":foo_proto"],)proto_library( name = "foo_proto",)
| Attributes | |
|---|---|
name |
A unique name for this target. |
deps |
proto_library rules to generate Java code for. |
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)
Ajava_test() rule compiles a Java test. A test is a binary wrapper around yourtest code. The test runner's main method is invoked instead of the main class being compiled.
name.jar: A Java archive.name_deploy.jar: A Java archive suitable for deployment. (Only built if explicitly requested.) See the description of thename_deploy.jar output fromjava_binary for more details.See the section onjava_binary() arguments. This rule alsosupports allattributes commonto all test rules (*_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", ],)
| Attributes | |
|---|---|
name |
A unique name for this target. |
deps |
deps atAttributes common to all build rules. |
srcs |
Source files of type Source files of type Rules: if the rule (typically This argument is almost always required, except if a |
resources |
If resources are specified, they will be bundled in the jar along with the usual Resources may be source files or generated files. |
classpath_resources |
A list of resources that must be located at the root of the java tree. This attribute's only purpose is to support third-party libraries that require that their resources be found on the classpath as exactly |
create_executable |
launcher ormain_class attributes are set. |
deploy_manifest_lines |
META-INF/manifest.mf file generated for the*_deploy.jar target. The contents of this attribute arenot subject to"Make variable" substitution. |
javacopts |
These compiler options are passed to javac after the global compiler options. |
jvm_flags |
The wrapper script for a Java binary includes a CLASSPATH definition (to find all the dependent jars) and invokes the right Java interpreter. The command line generated by the wrapper script includes the name of the main class followed by a Note that this attribute hasno effect on |
launcher |
bin/java program included with the JDK. The target must be acc_binary. Anycc_binary that implements the Java Invocation API can be specified as a value for this attribute.By default, Bazel will use the normal JDK launcher (bin/java or java.exe). The related Note that your native (C++, SWIG, JNI) dependencies will be built differently depending on whether you are using the JDK launcher or another launcher:
When using any launcher other than the default JDK launcher, the format of the |
main_class |
main() method to use as entry point. If a rule uses this option, it does not need asrcs=[...] list. Thus, with this attribute one can make an executable from a Java library that already contains one or moremain() methods. The value of this attribute is a class name, not a source file. The class must be available at runtime: it may be compiled by this rule (from |
plugins |
java_plugin specified in this attribute will be run whenever this rule is built. A library may also inherit plugins from dependencies that useexported_plugins. Resources generated by the plugin will be included in the resulting jar of this rule. |
resource_jars |
If specified, the contents of these jars are merged into the output jar. |
resource_strip_prefix |
If specified, this path prefix is stripped from every file in the |
runtime_deps |
deps, these will appear on the runtime classpath, but unlike them, not on the compile-time classpath. Dependencies needed only at runtime should be listed here. Dependency-analysis tools should ignore targets that appear in bothruntime_deps anddeps. |
stamp |
Stamped binaries arenot rebuilt unless their dependencies change. |
test_class |
By default, if this argument is not defined then the legacy mode is used and the test arguments are used instead. Set the This attribute specifies the name of a Java class to be run by this test. It is rare to need to set this. If this argument is omitted, it will be inferred using the target's For JUnit3, the test class needs to either be a subclass of This attribute allows several |
use_launcher |
If this attribute is set to false, thelauncher attribute and the related |
use_testrunner |
com.google.testing.junit.runner.BazelTestRunner) class as the main entry point for a Java program, and provide the test class to the test runner as a value ofbazel.test_suite system property. You can use this to override the default behavior, which is to use test runner forjava_test rules, and not use it forjava_binary rules. It is unlikely you will want to do this. One use is forAllTest rules that are invoked by another rule (to set up a database before running the tests, for example). TheAllTest rule must be declared as ajava_binary, but should still use the test runner as its main entry point. The name of a test runner class can be overridden withmain_class attribute. |
java_package_configuration(name,data,compatible_with,deprecation,distribs,features,javacopts,licenses,packages,restricted_to,tags,target_compatible_with,testonly,visibility)
Configuration to apply to a set of packages.Configurations can be added tojava_toolchain.javacoptss.
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", ])
| Attributes | |
|---|---|
name |
A unique name for this target. |
data |
|
javacopts |
|
packages |
package_groups the configuration should be applied to. |
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 defines plugins for the Java compiler run by Bazel. At the moment, the only supported kind of plugins are annotation processors. Ajava_library orjava_binary rule can run plugins by depending on them via theplugins attribute. Ajava_library can also automatically export plugins to libraries that directly depend on it usingexported_plugins.
libname.jar: A Java archive. Arguments are identical tojava_library, except for the addition of theprocessor_class argument.
| Attributes | |
|---|---|
name |
A unique name for this target. |
deps |
deps atAttributes common to all build rules. The jars built by By contrast, targets in the |
srcs |
Source files of type Source files of type Rules: if the rule (typically This argument is almost always required, except if a |
data |
data atAttributes common to all build rules. When building a |
resources |
If resources are specified, they will be bundled in the jar along with the usual Resources may be source files or generated files. |
generates_api |
If a rule uses an API-generating annotation processor, other rules depending on it can refer to the generated code only if their compilation actions are scheduled after the generating rule. This attribute instructs Bazel to introduce scheduling constraints when --java_header_compilation is enabled. WARNING: This attribute affects build performance, use it only if necessary. |
javacopts |
These compiler options are passed to javac after the global compiler options. |
neverlink |
tools.jar for anything running on a standard JDK. Note that If the runtime library differs from the compilation library then you must ensure that it differs only in places that the JLS forbids compilers to inline (and that must hold for all future versions of the JLS). |
output_licenses |
common attributes |
plugins |
java_plugin specified in this attribute will be run whenever this rule is built. A library may also inherit plugins from dependencies that useexported_plugins. Resources generated by the plugin will be included in the resulting jar of this rule. |
processor_class |
|
proguard_specs |
android_binary target depending on this library. The files included here must only have idempotent rules, namely -dontnote, -dontwarn, assumenosideeffects, and rules that start with -keep. Other options can only appear inandroid_binary's proguard_specs, to ensure non-tautological merges. |
resource_jars |
If specified, the contents of these jars are merged into the output jar. |
resource_strip_prefix |
If specified, this path prefix is stripped from every file in the |
java_runtime(name,srcs,compatible_with,deprecation,distribs,features,java,java_home,licenses,restricted_to,tags,target_compatible_with,testonly,visibility)
Specifies the configuration for a Java runtime.
java_runtime( name = "jdk-9-ea+153", srcs = glob(["jdk9-ea+153/**"]), java_home = "jdk9-ea+153",)
| Attributes | |
|---|---|
name |
A unique name for this target. |
srcs |
|
java |
|
java_home |
srcs andjava attributes must be empty. |
java_toolchain(name,android_lint_data,android_lint_jvm_opts,android_lint_opts,android_lint_package_configuration,android_lint_runner,bootclasspath,compatible_with,deprecation,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)
Specifies the configuration for the Java compiler. Which toolchain to be used can be changed throughthe --java_toolchain argument. Normally you should not write those kind of rules unless you want totune your Java compiler.
A simple example would be:
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",)
| Attributes | |
|---|---|
name |
A unique name for this target. |
android_lint_data |
|
android_lint_jvm_opts |
|
android_lint_opts |
|
android_lint_package_configuration |
|
android_lint_runner |
|
bootclasspath |
|
forcibly_disable_header_compilation |
|
genclass |
|
header_compiler |
|
header_compiler_direct |
This tool does not support annotation processing. |
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 |
|