Java Rules
Rules
java_binary
java_binary(name, deps, srcs, data, resources, args, classpath_resources, compatible_with, create_executable, deploy_env, deploy_manifest_lines, deprecation, distribs, exec_compatible_with, features, javacopts, jvm_flags, launcher, licenses, main_class, output_licenses, plugins, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, stamp, tags, testonly, toolchains, 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.
Implicit output targets
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 the JVM 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 a launcher 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.
A deps
attribute is not allowed in a java_binary
rule without
srcs
; such a rule requires a
main_class
provided by
runtime_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", ], )
Arguments
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 be Main .
|
deps
|
deps at
Attributes 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 or main_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 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 .
|
deploy_manifest_lines
|
META-INF/manifest.mf file generated for the
*_deploy.jar target. The contents of this attribute are not 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 has no effect on |
launcher
|
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 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 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 |
plugins
|
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.
|
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 both
runtime_deps and deps .
|
stamp
|
|
toolchains
|
|
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 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.
|
java_import
java_import(name, deps, data, compatible_with, constraints, deprecation, distribs, exec_compatible_with, exports, features, jars, licenses, neverlink, proguard_specs, restricted_to, runtime_deps, srcjar, tags, testonly, visibility)
This rule allows the use of precompiled .jar
files as
libraries for java_library
and
java_binary
rules.
Examples
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", ], )
Arguments
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 in
android_binary 's proguard_specs, to ensure non-tautological merges.
|
runtime_deps
|
|
srcjar
|
|
java_library
java_library(name, deps, srcs, data, resources, compatible_with, deprecation, distribs, exec_compatible_with, exported_plugins, exports, features, javacopts, licenses, neverlink, plugins, proguard_specs, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, tags, testonly, visibility)
This rule compiles and links sources into a .jar
file.
Implicit output targets
libname.jar
: A Java archive containing the class files.libname-src.jar
: An archive containing the sources ("source jar").
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
deps
|
deps at
Attributes 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 at
Attributes 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_plugin s (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 rule X can access the code in Y if there exists a dependency
path between them that begins with a
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 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 use
exported_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 in
android_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 both
runtime_deps and deps .
|
java_lite_proto_library
java_lite_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, features, licenses, restricted_to, tags, testonly, visibility)
java_lite_proto_library
generates Java code from .proto
files.
deps
must point to proto_library
rules.
Example:
java_library( name = "lib", deps = [":foo"], ) java_lite_proto_library( name = "foo", deps = [":bar"], ) proto_library( name = "bar", )
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
deps
|
proto_library
rules to generate Java code for.
|
java_proto_library
java_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, features, licenses, restricted_to, tags, testonly, visibility)
java_proto_library
generates Java code from .proto
files.
deps
must point to proto_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", )
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
deps
|
proto_library
rules to generate Java code for.
|
java_test
java_test(name, deps, srcs, data, resources, args, classpath_resources, compatible_with, create_executable, deploy_manifest_lines, deprecation, distribs, exec_compatible_with, 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, test_class, testonly, timeout, toolchains, use_testrunner, visibility)
A java_test()
rule compiles a Java test. A test is a binary wrapper around your
test code. The test runner's main method is invoked instead of the main class being compiled.
Implicit output targets
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 from java_binary for more details.
See the section on java_binary() arguments. This rule also supports all attributes common to all test rules (*_test).
Examples
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", ], )
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
deps
|
deps at
Attributes 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 or main_class attributes
are set.
|
deploy_manifest_lines
|
META-INF/manifest.mf file generated for the
*_deploy.jar target. The contents of this attribute are not 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 has no effect on |
launcher
|
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 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 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 |
plugins
|
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.
|
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 both
runtime_deps and deps .
|
stamp
|
|
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 |
toolchains
|
|
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 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.
|
java_package_configuration
java_package_configuration(name, data, compatible_with, deprecation, distribs, features, javacopts, licenses, packages, restricted_to, tags, testonly, visibility)
Configuration to apply to a set of packages.
Configurations can be added to
java_toolchain.javacopts
s.
Example:
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", ] )
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
data
|
|
javacopts
|
|
packages
|
package_group s
the configuration should be applied to.
|
java_plugin
java_plugin(name, deps, srcs, data, resources, compatible_with, deprecation, distribs, exec_compatible_with, features, generates_api, javacopts, licenses, neverlink, output_licenses, plugins, processor_class, proguard_specs, resource_jars, resource_strip_prefix, restricted_to, tags, 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. A java_library
or
java_binary
rule can run plugins by depending on them via the plugins
attribute. A java_library
can also automatically export plugins to libraries that
directly depend on it using
exported_plugins
.
Implicit output targets
libname.jar
: A Java archive.
Arguments are identical to java_library
, except
for the addition of the processor_class
argument.
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
deps
|
deps at
Attributes 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 at
Attributes 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 use
exported_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 in
android_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
java_runtime(name, srcs, compatible_with, deprecation, distribs, features, java, java_home, licenses, restricted_to, tags, testonly, visibility)
Specifies the configuration for a Java runtime.
Example:
java_runtime( name = "jdk-9-ea+153", srcs = glob(["jdk9-ea+153/**"]), java_home = "jdk9-ea+153", )
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
srcs
|
|
java
|
|
java_home
|
srcs and |
java_toolchain
java_toolchain(name, bootclasspath, compatible_with, deprecation, distribs, extclasspath, features, forcibly_disable_header_compilation, genclass, header_compiler, header_compiler_direct, ijar, javabuilder, javac, javac_supports_workers, javacopts, jvm_opts, licenses, oneversion, oneversion_whitelist, package_configuration, resourcejar, restricted_to, singlejar, source_version, tags, target_version, testonly, timezone_data, tools, visibility, xlint)
Specifies the configuration for the Java compiler. Which toolchain to be used can be changed through the --java_toolchain argument. Normally you should not write those kind of rules unless you want to tune your Java compiler.
Examples
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", )
Arguments
Attributes | |
---|---|
name |
A unique name for this target. |
bootclasspath
|
|
extclasspath
|
|
forcibly_disable_header_compilation
|
|
genclass
|
|
header_compiler
|
|
header_compiler_direct
|
This tool does not support annotation processing. |
ijar
|
|
javabuilder
|
|
javac
|
|
javac_supports_workers
|
|
javacopts
|
|
jvm_opts
|
|
oneversion
|
|
oneversion_whitelist
|
|
package_configuration
|
|
resourcejar
|
|
singlejar
|
|
source_version
|
|
target_version
|
|
timezone_data
|
|
tools
|
|
xlint
|
|