Java rules

Rules

java_binary

ATTRIBUTES

NameDescriptionTypeMandatoryDefault
nameA unique name for this target.Namerequired
depsThe list of other libraries to be linked in to the target. See general comments about deps at Typical attributes defined by most build rules.List of labelsoptional[]
srcsThe list of source files that are processed to create the target. This attribute is almost always required; see exceptions below. Source files of type .java are compiled. In case of generated .java files it is generally advisable to put the generating rule's name here instead of the name of the file itself. This not only improves readability but makes the rule more resilient to future changes: if the generating rule generates different files in the future, you only need to fix one place: the outs of the generating rule. You should not list the generating rule in deps because it is a no-op. Source files of type .srcjar are unpacked and compiled. (This is useful if you need to generate a set of .java files with a genrule.) Rules: if the rule (typically genrule or filegroup) generates any of the files listed above, they will be used the same way as described for source files.

This argument is almost always required, except if a main_class attribute specifies a class on the runtime classpath or you specify the runtime_deps argument.
List of labelsoptional[]
dataThe list of files needed by this library at runtime. See general comments about data at Typical attributes defined by most build rules.List of labelsoptional[]
resourcesA list of data files to include in a Java jar.

Resources may be source files or generated files.

If resources are specified, they will be bundled in the jar along with the usual .class files produced by compilation. The location of the resources inside of the jar file is determined by the project structure. Bazel first looks for Maven's standard directory layout, (a “src” directory followed by a “resources” directory grandchild). If that is not found, Bazel then looks for the topmost directory named “java” or “javatests” (so, for example, if a resource is at <workspace root>/x/java/y/java/z, the path of the resource will be y/java/z. This heuristic cannot be overridden, however, the resource_strip_prefix attribute can be used to specify a specific alternative directory for resource files.
List of labelsoptional[]
add_exportsAllow this library to access the given module or package. This corresponds to the javac and JVM --add-exports= flags.List of stringsoptional[]
add_opensAllow this library to reflectively access the given module or package. This corresponds to the javac and JVM --add-opens= flags.List of stringsoptional[]
bootclasspathRestricted API, do not use!LabeloptionalNone
classpath_resourcesDO NOT USE THIS OPTION UNLESS THERE IS NO OTHER WAY) 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 “myconfig.xml”. It is only allowed on binaries and not libraries, due to the danger of namespace conflicts. List of labelsoptional[]
create_executableDeprecated, use java_single_jar instead.BooleanoptionalTrue
deploy_envA list of other java_binary targets which represent the deployment environment for this binary. Set this attribute when building a plugin which will be loaded by another java_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.
List of labelsoptional[]
deploy_manifest_linesA list of lines to add to the META-INF/manifest.mf file generated for the *_deploy.jar target. The contents of this attribute are not subject to “Make variable” substitution.List of stringsoptional[]
env-Dictionary: String -> Stringoptional{}
javacoptsExtra compiler options for this binary. Subject to “Make variable” substitution and Bourne shell tokenization. These compiler options are passed to javac after the global compiler options.List of stringsoptional[]
jvm_flagsA list of flags to embed in the wrapper script generated for running this binary. Subject to $(location) and “Make variable” substitution, and Bourne shell tokenization.

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 “$@” so you can pass along other arguments after the classname. However, arguments intended for parsing by the JVM must be specified before the classname on the command line. The contents of jvm_flags are added to the wrapper script before the classname is listed.

Note that this attribute has no effect on *_deploy.jar outputs.
List of stringsoptional[]
launcherSpecify a binary that will be used to run your Java program instead of the normal bin/java program included with the JDK. The target must be a cc_binary. Any cc_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 --java_launcher Bazel flag affects only those java_binary and java_test targets that have not specified a launcher attribute.

Note that your native (C++, SWIG, JNI) dependencies will be built differently depending on whether you are using the JDK launcher or another launcher:

If you are using the normal JDK launcher (the default), native dependencies are built as a shared library named {name}_nativedeps.so, where {name} is the name attribute of this java_binary rule. Unused code is not removed by the linker in this configuration.

If you are using any other launcher, native (C++) dependencies are statically linked into a binary named {name}_nativedeps, where {name} is the name attribute of this java_binary rule. In this case, the linker will remove any code it thinks is unused from the resulting binary, which means any C++ code accessed only via JNI may not be linked in unless that cc_library target specifies alwayslink = True.

When using any launcher other than the default JDK launcher, the format of the *_deploy.jar output changes. See the main java_binary docs for details.
LabeloptionalNone
licenses-List of stringsoptional[]
main_className of class with main() method to use as entry point. If a rule uses this option, it does not need a srcs=[...] list. Thus, with this attribute one can make an executable from a Java library that already contains one or more main() 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 srcs) or provided by direct or transitive dependencies (through runtime_deps or deps). If the class is unavailable, the binary will fail at runtime; there is no build-time check. Stringoptional""
neverlink-BooleanoptionalFalse
pluginsJava compiler plugins to run at compile-time. Every java_plugin specified in this attribute will be run whenever this rule is built. A library may also inherit plugins from dependencies that use exported_plugins. Resources generated by the plugin will be included in the resulting jar of this rule.List of labelsoptional[]
resource_strip_prefixThe path prefix to strip from Java resources. If specified, this path prefix is stripped from every file in the resources attribute. It is an error for a resource file not to be under this directory. If not specified (the default), the path of resource file is determined according to the same logic as the Java package of source files. For example, a source file at stuff/java/foo/bar/a.txt will be located at foo/bar/a.txt. Stringoptional""
runtime_depsLibraries to make available to the final binary or test at runtime only. Like ordinary 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 both runtime_deps and deps.List of labelsoptional[]
stampWhether to encode build information into the binary. Possible values: stamp = 1: Always stamp the build information into the binary, even in --nostamp builds. This setting should be avoided, since it potentially kills remote caching for the binary and any downstream actions that depend on it. stamp = 0: Always replace build information by constant values. This gives good build result caching. stamp = -1: Embedding of build information is controlled by the --[no]stamp flag. Stamped binaries are not rebuilt unless their dependencies change.Integeroptional-1
use_launcherWhether the binary should use a custom launcher.

If this attribute is set to false, the launcher attribute and the related --java_launcher flag will be ignored for this target.
BooleanoptionalTrue
use_testrunnerUse the test runner (by default 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 of bazel.test_suite system property.


You can use this to override the default behavior, which is to use test runner for java_test rules, and not use it for java_binary rules. It is unlikely you will want to do this. One use is for AllTest rules that are invoked by another rule (to set up a database before running the tests, for example). The AllTest rule must be declared as a java_binary, but should still use the test runner as its main entry point.

The name of a test runner class can be overridden with main_class attribute.
BooleanoptionalFalse

java_import

ATTRIBUTES

NameDescriptionTypeMandatoryDefault
nameA unique name for this target.Namerequired
depsThe list of other libraries to be linked in to the target. See java_library.deps.List of labelsoptional[]
dataThe list of files needed by this rule at runtime.List of labelsoptional[]
add_exportsAllow this library to access the given module or package. This corresponds to the javac and JVM --add-exports= flags.List of stringsoptional[]
add_opensAllow this library to reflectively access the given module or package. This corresponds to the javac and JVM --add-opens= flags.List of stringsoptional[]
constraintsExtra constraints imposed on this rule as a Java library.List of stringsoptional[]
exportsTargets to make available to users of this rule. See java_library.exports.List of labelsoptional[]
jarsThe list of JAR files provided to Java targets that depend on this target.List of labelsrequired
licenses-List of stringsoptional[]
neverlinkOnly use this library for compilation and not at runtime. Useful if the library will be provided by the runtime environment during execution. Examples of libraries like this are IDE APIs for IDE plug-ins or tools.jar for anything running on a standard JDK.BooleanoptionalFalse
proguard_specsFiles to be used as Proguard specification. These will describe the set of specifications to be used by Proguard. If specified, they will be added to any 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 in android_binary's proguard_specs, to ensure non-tautological merges.
List of labelsoptional[]
runtime_depsLibraries to make available to the final binary or test at runtime only. See java_library.runtime_deps.List of labelsoptional[]
srcjarA JAR file that contains source code for the compiled JAR files.LabeloptionalNone

java_library

ATTRIBUTES

NameDescriptionTypeMandatoryDefault
nameA unique name for this target.Namerequired
depsThe list of libraries to link into this library. See general comments about deps at Typical attributes defined by most build rules. The jars built by java_library rules listed in deps will be on the compile-time classpath of this rule. Furthermore the transitive closure of their deps, runtime_deps and exports will be on the runtime classpath. By contrast, targets in the data attribute are included in the runfiles but on neither the compile-time nor runtime classpath. List of labelsoptional[]
srcsThe list of source files that are processed to create the target. This attribute is almost always required; see exceptions below. Source files of type .java are compiled. In case of generated .java files it is generally advisable to put the generating rule's name here instead of the name of the file itself. This not only improves readability but makes the rule more resilient to future changes: if the generating rule generates different files in the future, you only need to fix one place: the outs of the generating rule. You should not list the generating rule in deps because it is a no-op. Source files of type .srcjar are unpacked and compiled. (This is useful if you need to generate a set of .java files with a genrule.) Rules: if the rule (typically genrule or filegroup) generates any of the files listed above, they will be used the same way as described for source files. Source files of type .properties are treated as resources.

All other files are ignored, as long as there is at least one file of a file type described above. Otherwise an error is raised.

This argument is almost always required, except if you specify the runtime_deps argument.
List of labelsoptional[]
dataThe list of files needed by this library at runtime. See general comments about data at Typical attributes defined by most build rules. When building a java_library, Bazel doesn't put these files anywhere; if the data files are generated files then Bazel generates them. When building a test that depends on this java_library Bazel copies or links the data files into the runfiles area. List of labelsoptional[]
resourcesA list of data files to include in a Java jar. Resources may be source files or generated files.

If resources are specified, they will be bundled in the jar along with the usual .class files produced by compilation. The location of the resources inside of the jar file is determined by the project structure. Bazel first looks for Maven's standard directory layout, (a “src” directory followed by a “resources” directory grandchild). If that is not found, Bazel then looks for the topmost directory named “java” or “javatests” (so, for example, if a resource is at <workspace root>/x/java/y/java/z, the path of the resource will be y/java/z. This heuristic cannot be overridden, however, the resource_strip_prefix attribute can be used to specify a specific alternative directory for resource files.
List of labelsoptional[]
add_exportsAllow this library to access the given module or package. This corresponds to the javac and JVM --add-exports= flags.List of stringsoptional[]
add_opensAllow this library to reflectively access the given module or package. This corresponds to the javac and JVM --add-opens= flags.List of stringsoptional[]
bootclasspathRestricted API, do not use!LabeloptionalNone
exported_pluginsThe list of java_plugins (e.g. annotation processors) to export to libraries that directly depend on this library. The specified list of java_plugins will be applied to any library which directly depends on this library, just as if that library had explicitly declared these labels in plugins. List of labelsoptional[]
exportsExported libraries. 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) deps. Summary: a rule X can access the code in Y if there exists a dependency path between them that begins with a deps edge followed by zero or more exports edges. Let‘s see some examples to illustrate this. Assume A depends on B and B depends on C. In this case C is a transitive 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 deps, or B can make it easier for A (and anything that may depend on A) by declaring C in its (B‘s) exports attribute. 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 deps. List of labelsoptional[]
javabuilder_jvm_flagsRestricted API, do not use!List of stringsoptional[]
javacoptsExtra compiler options for this library. Subject to “Make variable” substitution and Bourne shell tokenization. These compiler options are passed to javac after the global compiler options.List of stringsoptional[]
licenses-List of stringsoptional[]
neverlinkWhether this library should only be used for compilation and not at runtime. Useful if the library will be provided by the runtime environment during execution. Examples of such libraries are the IDE APIs for IDE plug-ins or tools.jar for anything running on a standard JDK. Note that neverlink = True does not prevent the compiler from inlining material from this library into compilation targets that depend on it, as permitted by the Java Language Specification (e.g., static final constants of String or of primitive types). The preferred use case is therefore when the runtime library is identical to the compilation library. 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). BooleanoptionalFalse
pluginsJava compiler plugins to run at compile-time. Every java_plugin specified in this attribute will be run whenever this rule is built. A library may also inherit plugins from dependencies that use exported_plugins. Resources generated by the plugin will be included in the resulting jar of this rule.List of labelsoptional[]
proguard_specsFiles to be used as Proguard specification. These will describe the set of specifications to be used by Proguard. If specified, they will be added to any 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 in android_binary's proguard_specs, to ensure non-tautological merges.
List of labelsoptional[]
resource_strip_prefixThe path prefix to strip from Java resources. If specified, this path prefix is stripped from every file in the resources attribute. It is an error for a resource file not to be under this directory. If not specified (the default), the path of resource file is determined according to the same logic as the Java package of source files. For example, a source file at stuff/java/foo/bar/a.txt will be located at foo/bar/a.txt. Stringoptional""
runtime_depsLibraries to make available to the final binary or test at runtime only. Like ordinary 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 both runtime_deps and deps.List of labelsoptional[]

java_package_configuration

ATTRIBUTES

NameDescriptionTypeMandatoryDefault
nameA unique name for this target.Namerequired
dataThe list of files needed by this configuration at runtime.List of labelsoptional[]
javacoptsJava compiler flags.List of stringsoptional[]
output_licenses-List of stringsoptional[]
packagesThe set of package_groups the configuration should be applied to.List of labelsoptional[]
systemCorresponds to javac's --system flag.LabeloptionalNone

java_plugin

ATTRIBUTES

NameDescriptionTypeMandatoryDefault
nameA unique name for this target.Namerequired
depsThe list of libraries to link into this library. See general comments about deps at Typical attributes defined by most build rules. The jars built by java_library rules listed in deps will be on the compile-time classpath of this rule. Furthermore the transitive closure of their deps, runtime_deps and exports will be on the runtime classpath. By contrast, targets in the data attribute are included in the runfiles but on neither the compile-time nor runtime classpath. List of labelsoptional[]
srcsThe list of source files that are processed to create the target. This attribute is almost always required; see exceptions below. Source files of type .java are compiled. In case of generated .java files it is generally advisable to put the generating rule's name here instead of the name of the file itself. This not only improves readability but makes the rule more resilient to future changes: if the generating rule generates different files in the future, you only need to fix one place: the outs of the generating rule. You should not list the generating rule in deps because it is a no-op. Source files of type .srcjar are unpacked and compiled. (This is useful if you need to generate a set of .java files with a genrule.) Rules: if the rule (typically genrule or filegroup) generates any of the files listed above, they will be used the same way as described for source files. Source files of type .properties are treated as resources.

All other files are ignored, as long as there is at least one file of a file type described above. Otherwise an error is raised.

This argument is almost always required, except if you specify the runtime_deps argument.
List of labelsoptional[]
dataThe list of files needed by this library at runtime. See general comments about data at Typical attributes defined by most build rules. When building a java_library, Bazel doesn't put these files anywhere; if the data files are generated files then Bazel generates them. When building a test that depends on this java_library Bazel copies or links the data files into the runfiles area. List of labelsoptional[]
resourcesA list of data files to include in a Java jar. Resources may be source files or generated files.

If resources are specified, they will be bundled in the jar along with the usual .class files produced by compilation. The location of the resources inside of the jar file is determined by the project structure. Bazel first looks for Maven's standard directory layout, (a “src” directory followed by a “resources” directory grandchild). If that is not found, Bazel then looks for the topmost directory named “java” or “javatests” (so, for example, if a resource is at <workspace root>/x/java/y/java/z, the path of the resource will be y/java/z. This heuristic cannot be overridden, however, the resource_strip_prefix attribute can be used to specify a specific alternative directory for resource files.
List of labelsoptional[]
add_exportsAllow this library to access the given module or package. This corresponds to the javac and JVM --add-exports= flags.List of stringsoptional[]
add_opensAllow this library to reflectively access the given module or package. This corresponds to the javac and JVM --add-opens= flags.List of stringsoptional[]
bootclasspathRestricted API, do not use!LabeloptionalNone
generates_apiThis attribute marks annotation processors that generate API code. 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.BooleanoptionalFalse
javabuilder_jvm_flagsRestricted API, do not use!List of stringsoptional[]
javacoptsExtra compiler options for this library. Subject to “Make variable” substitution and Bourne shell tokenization. These compiler options are passed to javac after the global compiler options.List of stringsoptional[]
licenses-List of stringsoptional[]
neverlinkWhether this library should only be used for compilation and not at runtime. Useful if the library will be provided by the runtime environment during execution. Examples of such libraries are the IDE APIs for IDE plug-ins or tools.jar for anything running on a standard JDK. Note that neverlink = True does not prevent the compiler from inlining material from this library into compilation targets that depend on it, as permitted by the Java Language Specification (e.g., static final constants of String or of primitive types). The preferred use case is therefore when the runtime library is identical to the compilation library. 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). BooleanoptionalFalse
output_licenses-List of stringsoptional[]
pluginsJava compiler plugins to run at compile-time. Every java_plugin specified in this attribute will be run whenever this rule is built. A library may also inherit plugins from dependencies that use exported_plugins. Resources generated by the plugin will be included in the resulting jar of this rule.List of labelsoptional[]
processor_classThe processor class is the fully qualified type of the class that the Java compiler should use as entry point to the annotation processor. If not specified, this rule will not contribute an annotation processor to the Java compiler‘s annotation processing, but its runtime classpath will still be included on the compiler’s annotation processor path. (This is primarily intended for use by Error Prone plugins, which are loaded from the annotation processor path using java.util.ServiceLoader.)Stringoptional""
proguard_specsFiles to be used as Proguard specification. These will describe the set of specifications to be used by Proguard. If specified, they will be added to any 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 in android_binary's proguard_specs, to ensure non-tautological merges.
List of labelsoptional[]
resource_strip_prefixThe path prefix to strip from Java resources. If specified, this path prefix is stripped from every file in the resources attribute. It is an error for a resource file not to be under this directory. If not specified (the default), the path of resource file is determined according to the same logic as the Java package of source files. For example, a source file at stuff/java/foo/bar/a.txt will be located at foo/bar/a.txt. Stringoptional""

java_runtime

ATTRIBUTES

NameDescriptionTypeMandatoryDefault
nameA unique name for this target.Namerequired
srcsAll files in the runtime.List of labelsoptional[]
default_cdsDefault CDS archive for hermetic java_runtime. When hermetic is enabled for a java_binary target and if the target does not provide its own CDS archive by specifying the classlist attribute, the java_runtime default CDS is packaged in the hermetic deploy JAR.LabeloptionalNone
hermetic_srcsFiles in the runtime needed for hermetic deployments.List of labelsoptional[]
hermetic_static_libsThe libraries that are statically linked with the launcher for hermetic deploymentsList of labelsoptional[]
javaThe path to the java executable.LabeloptionalNone
java_homeThe path to the root of the runtime. Subject to “Make” variable substitution. If this path is absolute, the rule denotes a non-hermetic Java runtime with a well-known path. In that case, the srcs and java attributes must be empty.Stringoptional""
lib_ct_symThe lib/ct.sym file needed for compilation with --release. If not specified and there is exactly one file in srcs whose path ends with /lib/ct.sym, that file is used.LabeloptionalNone
lib_modulesThe lib/modules file needed for hermetic deployments.LabeloptionalNone
output_licenses-List of stringsoptional[]
versionThe feature version of the Java runtime. I.e., the integer returned by Runtime.version().feature().Integeroptional0

java_test

ATTRIBUTES

NameDescriptionTypeMandatoryDefault
nameA unique name for this target.Namerequired
depsThe list of other libraries to be linked in to the target. See general comments about deps at Typical attributes defined by most build rules.List of labelsoptional[]
srcsThe list of source files that are processed to create the target. This attribute is almost always required; see exceptions below. Source files of type .java are compiled. In case of generated .java files it is generally advisable to put the generating rule's name here instead of the name of the file itself. This not only improves readability but makes the rule more resilient to future changes: if the generating rule generates different files in the future, you only need to fix one place: the outs of the generating rule. You should not list the generating rule in deps because it is a no-op. Source files of type .srcjar are unpacked and compiled. (This is useful if you need to generate a set of .java files with a genrule.) Rules: if the rule (typically genrule or filegroup) generates any of the files listed above, they will be used the same way as described for source files.

This argument is almost always required, except if a main_class attribute specifies a class on the runtime classpath or you specify the runtime_deps argument.
List of labelsoptional[]
dataThe list of files needed by this library at runtime. See general comments about data at Typical attributes defined by most build rules.List of labelsoptional[]
resourcesA list of data files to include in a Java jar.

Resources may be source files or generated files.

If resources are specified, they will be bundled in the jar along with the usual .class files produced by compilation. The location of the resources inside of the jar file is determined by the project structure. Bazel first looks for Maven's standard directory layout, (a “src” directory followed by a “resources” directory grandchild). If that is not found, Bazel then looks for the topmost directory named “java” or “javatests” (so, for example, if a resource is at <workspace root>/x/java/y/java/z, the path of the resource will be y/java/z. This heuristic cannot be overridden, however, the resource_strip_prefix attribute can be used to specify a specific alternative directory for resource files.
List of labelsoptional[]
add_exportsAllow this library to access the given module or package. This corresponds to the javac and JVM --add-exports= flags.List of stringsoptional[]
add_opensAllow this library to reflectively access the given module or package. This corresponds to the javac and JVM --add-opens= flags.List of stringsoptional[]
bootclasspathRestricted API, do not use!LabeloptionalNone
classpath_resourcesDO NOT USE THIS OPTION UNLESS THERE IS NO OTHER WAY) 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 “myconfig.xml”. It is only allowed on binaries and not libraries, due to the danger of namespace conflicts. List of labelsoptional[]
create_executableDeprecated, use java_single_jar instead.BooleanoptionalTrue
deploy_manifest_linesA list of lines to add to the META-INF/manifest.mf file generated for the *_deploy.jar target. The contents of this attribute are not subject to “Make variable” substitution.List of stringsoptional[]
env-Dictionary: String -> Stringoptional{}
env_inherit-List of stringsoptional[]
javacoptsExtra compiler options for this binary. Subject to “Make variable” substitution and Bourne shell tokenization. These compiler options are passed to javac after the global compiler options.List of stringsoptional[]
jvm_flagsA list of flags to embed in the wrapper script generated for running this binary. Subject to $(location) and “Make variable” substitution, and Bourne shell tokenization.

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 “$@” so you can pass along other arguments after the classname. However, arguments intended for parsing by the JVM must be specified before the classname on the command line. The contents of jvm_flags are added to the wrapper script before the classname is listed.

Note that this attribute has no effect on *_deploy.jar outputs.
List of stringsoptional[]
launcherSpecify a binary that will be used to run your Java program instead of the normal bin/java program included with the JDK. The target must be a cc_binary. Any cc_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 --java_launcher Bazel flag affects only those java_binary and java_test targets that have not specified a launcher attribute.

Note that your native (C++, SWIG, JNI) dependencies will be built differently depending on whether you are using the JDK launcher or another launcher:

If you are using the normal JDK launcher (the default), native dependencies are built as a shared library named {name}_nativedeps.so, where {name} is the name attribute of this java_binary rule. Unused code is not removed by the linker in this configuration.

If you are using any other launcher, native (C++) dependencies are statically linked into a binary named {name}_nativedeps, where {name} is the name attribute of this java_binary rule. In this case, the linker will remove any code it thinks is unused from the resulting binary, which means any C++ code accessed only via JNI may not be linked in unless that cc_library target specifies alwayslink = True.

When using any launcher other than the default JDK launcher, the format of the *_deploy.jar output changes. See the main java_binary docs for details.
LabeloptionalNone
licenses-List of stringsoptional[]
main_className of class with main() method to use as entry point. If a rule uses this option, it does not need a srcs=[...] list. Thus, with this attribute one can make an executable from a Java library that already contains one or more main() 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 srcs) or provided by direct or transitive dependencies (through runtime_deps or deps). If the class is unavailable, the binary will fail at runtime; there is no build-time check. Stringoptional""
neverlink-BooleanoptionalFalse
pluginsJava compiler plugins to run at compile-time. Every java_plugin specified in this attribute will be run whenever this rule is built. A library may also inherit plugins from dependencies that use exported_plugins. Resources generated by the plugin will be included in the resulting jar of this rule.List of labelsoptional[]
resource_strip_prefixThe path prefix to strip from Java resources. If specified, this path prefix is stripped from every file in the resources attribute. It is an error for a resource file not to be under this directory. If not specified (the default), the path of resource file is determined according to the same logic as the Java package of source files. For example, a source file at stuff/java/foo/bar/a.txt will be located at foo/bar/a.txt. Stringoptional""
runtime_depsLibraries to make available to the final binary or test at runtime only. Like ordinary 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 both runtime_deps and deps.List of labelsoptional[]
stampWhether to encode build information into the binary. Possible values: stamp = 1: Always stamp the build information into the binary, even in --nostamp builds. This setting should be avoided, since it potentially kills remote caching for the binary and any downstream actions that depend on it. stamp = 0: Always replace build information by constant values. This gives good build result caching. stamp = -1: Embedding of build information is controlled by the --[no]stamp flag. Stamped binaries are not rebuilt unless their dependencies change.Integeroptional0
test_classThe Java class to be loaded by the test runner.
By default, if this argument is not defined then the legacy mode is used and the test arguments are used instead. Set the --nolegacy_bazel_java_test flag to not fallback on the first argument. 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 name and its source-root-relative path. If the test is located outside a known source root, Bazel will report an error if test_class is unset. For JUnit3, the test class needs to either be a subclass of junit.framework.TestCase or it needs to have a public static suite() method that returns a junit.framework.Test (or a subclass of Test). For JUnit4, the class needs to be annotated with org.junit.runner.RunWith. This attribute allows several java_test rules to share the same Test (TestCase, TestSuite, ...). Typically additional information is passed to it (e.g. via jvm_flags=[’-Dkey=value']) so that its behavior differs in each case, such as running a different subset of the tests. This attribute also enables the use of Java tests outside the javatests tree.
Stringoptional""
use_launcherWhether the binary should use a custom launcher.

If this attribute is set to false, the launcher attribute and the related --java_launcher flag will be ignored for this target.
BooleanoptionalTrue
use_testrunnerUse the test runner (by default 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 of bazel.test_suite system property.


You can use this to override the default behavior, which is to use test runner for java_test rules, and not use it for java_binary rules. It is unlikely you will want to do this. One use is for AllTest rules that are invoked by another rule (to set up a database before running the tests, for example). The AllTest rule must be declared as a java_binary, but should still use the test runner as its main entry point.

The name of a test runner class can be overridden with main_class attribute.
BooleanoptionalTrue

java_toolchain

ATTRIBUTES

NameDescriptionTypeMandatoryDefault
nameA unique name for this target.Namerequired
android_lint_dataLabels of tools available for label-expansion in android_lint_jvm_opts.List of labelsoptional[]
android_lint_jvm_optsThe list of arguments for the JVM when invoking Android Lint.List of stringsoptional[]
android_lint_optsThe list of Android Lint arguments.List of stringsoptional[]
android_lint_package_configurationAndroid Lint Configuration that should be applied to the specified package groups.List of labelsoptional[]
android_lint_runnerLabel of the Android Lint runner, if any.LabeloptionalNone
bootclasspathThe Java target bootclasspath entries. Corresponds to javac's -bootclasspath flag.List of labelsoptional[]
compatible_javacoptsInternal API, do not use!Dictionary: String -> List of stringsoptional{}
deps_checkerLabel of the ImportDepsChecker deploy jar.LabeloptionalNone
forcibly_disable_header_compilationOverrides --java_header_compilation to disable header compilation on platforms that do not support it, e.g. JDK 7 Bazel.BooleanoptionalFalse
genclassLabel of the GenClass deploy jar.LabeloptionalNone
header_compilerLabel of the header compiler. Required if --java_header_compilation is enabled.LabeloptionalNone
header_compiler_builtin_processorsInternal API, do not use!List of stringsoptional[]
header_compiler_directOptional label of the header compiler to use for direct classpath actions that do not include any API-generating annotation processors.

This tool does not support annotation processing.
LabeloptionalNone
ijarLabel of the ijar executable.LabeloptionalNone
jacocorunnerLabel of the JacocoCoverageRunner deploy jar.LabeloptionalNone
java_runtimeThe java_runtime to use with this toolchain. It defaults to java_runtime in execution configuration.LabeloptionalNone
javabuilderLabel of the JavaBuilder deploy jar.LabeloptionalNone
javabuilder_dataLabels of data available for label-expansion in javabuilder_jvm_opts.List of labelsoptional[]
javabuilder_jvm_optsThe list of arguments for the JVM when invoking JavaBuilder.List of stringsoptional[]
javac_supports_multiplex_workersTrue if JavaBuilder supports running as a multiplex persistent worker, false if it doesn't.BooleanoptionalTrue
javac_supports_worker_cancellationTrue if JavaBuilder supports cancellation of persistent workers, false if it doesn't.BooleanoptionalTrue
javac_supports_worker_multiplex_sandboxingTrue if JavaBuilder supports running as a multiplex persistent worker with sandboxing, false if it doesn't.BooleanoptionalFalse
javac_supports_workersTrue if JavaBuilder supports running as a persistent worker, false if it doesn't.BooleanoptionalTrue
javacoptsThe list of extra arguments for the Java compiler. Please refer to the Java compiler documentation for the extensive list of possible Java compiler flags.List of stringsoptional[]
jspecify_implicit_depsExperimental, do not use!LabeloptionalNone
jspecify_javacoptsExperimental, do not use!List of stringsoptional[]
jspecify_packagesExperimental, do not use!List of labelsoptional[]
jspecify_processorExperimental, do not use!LabeloptionalNone
jspecify_processor_classExperimental, do not use!Stringoptional""
jspecify_stubsExperimental, do not use!List of labelsoptional[]
jvm_optsThe list of arguments for the JVM when invoking the Java compiler. Please refer to the Java virtual machine documentation for the extensive list of possible flags for this option.List of stringsoptional[]
licenses-List of stringsoptional[]
miscDeprecated: use javacopts insteadList of stringsoptional[]
oneversionLabel of the one-version enforcement binary.LabeloptionalNone
oneversion_allowlistLabel of the one-version allowlist.LabeloptionalNone
oneversion_allowlist_for_testsLabel of the one-version allowlist for tests.LabeloptionalNone
oneversion_whitelistDeprecated: use oneversion_allowlist insteadLabeloptionalNone
package_configurationConfiguration that should be applied to the specified package groups.List of labelsoptional[]
proguard_allowlisterLabel of the Proguard allowlister.Labeloptional"@bazel_tools//tools/jdk:proguard_whitelister"
reduced_classpath_incompatible_processorsInternal API, do not use!List of stringsoptional[]
singlejarLabel of the SingleJar deploy jar.LabeloptionalNone
source_versionThe Java source version (e.g., ‘6’ or ‘7’). It specifies which set of code structures are allowed in the Java source code.Stringoptional""
target_versionThe Java target version (e.g., ‘6’ or ‘7’). It specifies for which Java runtime the class should be build.Stringoptional""
timezone_dataLabel of a resource jar containing timezone data. If set, the timezone data is added as an implicitly runtime dependency of all java_binary rules.LabeloptionalNone
toolsLabels of tools available for label-expansion in jvm_opts.List of labelsoptional[]
turbine_dataLabels of data available for label-expansion in turbine_jvm_opts.List of labelsoptional[]
turbine_jvm_optsThe list of arguments for the JVM when invoking turbine.List of stringsoptional[]
xlintThe list of warning to add or removes from default list. Precedes it with a dash to removes it. Please see the Javac documentation on the -Xlint options for more information.List of stringsoptional[]