diff --git a/java/bazel/rules/bazel_java_binary.bzl b/java/bazel/rules/bazel_java_binary.bzl
index 4b2a4b55..0611e062 100644
--- a/java/bazel/rules/bazel_java_binary.bzl
+++ b/java/bazel/rules/bazel_java_binary.bzl
@@ -122,6 +122,7 @@ def bazel_base_binary_impl(ctx, is_test_rule_class):
main_class,
coverage_main_class,
info.strip_as_default,
+ exclude_build_data = ctx.attr.exclude_build_data,
add_exports = info.add_exports,
add_opens = info.add_opens,
)
@@ -346,6 +347,13 @@ def make_binary_rule(implementation, *, doc, attrs, executable = False, test = F
BASE_BINARY_ATTRS = merge_attrs(
BASIC_JAVA_BINARY_ATTRIBUTES,
{
+ "exclude_build_data": attr.bool(
+ default = False,
+ doc = """
+Whether to omit the build-data.properties file from the
+*_deploy.jar output.
+ """,
+ ),
"resource_strip_prefix": attr.string(
doc = """
The path prefix to strip from Java resources.
diff --git a/java/common/rules/impl/java_binary_deploy_jar.bzl b/java/common/rules/impl/java_binary_deploy_jar.bzl
index d6add141..e4f5aa58 100644
--- a/java/common/rules/impl/java_binary_deploy_jar.bzl
+++ b/java/common/rules/impl/java_binary_deploy_jar.bzl
@@ -32,7 +32,8 @@ def create_deploy_archives(
one_version_level = "OFF",
one_version_allowlist = None,
extra_args = [],
- extra_manifest_lines = []):
+ extra_manifest_lines = [],
+ exclude_build_data = False):
""" Registers actions for _deploy.jar and _deploy.jar.unstripped
Args:
@@ -49,6 +50,7 @@ def create_deploy_archives(
one_version_allowlist: (File) Optional allowlist for one version check
extra_args: (list[Args]) Optional arguments for the deploy jar action
extra_manifest_lines: (list[String]) Optional lines added to the jar manifest
+ exclude_build_data: (bool) Whether to omit build-data.properties
"""
classpath_resources = java_attrs.classpath_resources
@@ -61,7 +63,10 @@ def create_deploy_archives(
order = "preorder",
)
multi_release = ctx.fragments.java.multi_release_deploy_jars
- build_info_files = helper.get_build_info(ctx, ctx.attr.stamp)
+ if exclude_build_data and ctx.attr.stamp == 1:
+ fail("Enabling stamping has no effect with exclude_build_data enabled")
+
+ build_info_files = [] if exclude_build_data else helper.get_build_info(ctx, ctx.attr.stamp)
build_target = str(ctx.label)
manifest_lines = ctx.attr.deploy_manifest_lines + extra_manifest_lines
create_deploy_archive(
@@ -76,6 +81,7 @@ def create_deploy_archives(
build_info_files,
build_target,
output = ctx.outputs.deployjar,
+ exclude_build_data = exclude_build_data,
one_version_level = one_version_level,
one_version_allowlist = one_version_allowlist,
multi_release = multi_release,
@@ -98,6 +104,7 @@ def create_deploy_archives(
build_info_files,
build_target,
output = ctx.outputs.unstrippeddeployjar,
+ exclude_build_data = exclude_build_data,
multi_release = multi_release,
hermetic = hermetic,
add_exports = add_exports,
@@ -125,7 +132,8 @@ def create_deploy_archive(
hermetic = False,
add_exports = [],
add_opens = [],
- extra_args = []):
+ extra_args = [],
+ exclude_build_data = False):
""" Creates a deploy jar
Requires a Java runtime toolchain if and only if hermetic is True.
@@ -150,6 +158,7 @@ def create_deploy_archive(
add_exports: (depset)
add_opens: (depset)
extra_args: (list[Args]) Optional arguments for the deploy jar action
+ exclude_build_data: (bool) Whether to omit build-data.properties
"""
input_files = []
input_files.extend(build_info_files)
@@ -177,7 +186,10 @@ def create_deploy_archive(
if main_class:
args.add("--main_class", main_class)
args.add_all("--deploy_manifest_lines", manifest_lines)
- args.add_all(build_info_files, before_each = "--build_info_file")
+ if exclude_build_data:
+ args.add("--exclude_build_data")
+ else:
+ args.add_all(build_info_files, before_each = "--build_info_file")
if launcher:
input_files.append(launcher)
args.add("--java_launcher", launcher)
diff --git a/test/java/bazel/rules/java_binary_tests.bzl b/test/java/bazel/rules/java_binary_tests.bzl
index 8436e0e6..107f63f9 100644
--- a/test/java/bazel/rules/java_binary_tests.bzl
+++ b/test/java/bazel/rules/java_binary_tests.bzl
@@ -1,9 +1,11 @@
"""Tests for the Bazel java_binary rule"""
+load("@bazel_features//private:util.bzl", _bazel_version_ge = "ge")
load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
load("@rules_testing//lib:truth.bzl", "matching")
load("@rules_testing//lib:util.bzl", "util")
load("//java:java_binary.bzl", "java_binary")
+load("//test/java/testutil:helper.bzl", "always_passes")
load("//test/java/testutil:java_info_subject.bzl", "java_info_subject")
load("//test/java/testutil:rules/template_var_info_rule.bzl", "template_var_info_rule")
@@ -49,6 +51,66 @@ def _test_java_binary_cross_compilation_to_unix_impl(env, target):
assert_action.substitutions().keys().contains("%jvm_flags%")
assert_action.inputs().contains_exactly(["java/bazel/rules/java_stub_template.txt"])
+def _test_java_binary_excludes_build_data(name):
+ if not _bazel_version_ge("8.0.0"):
+ always_passes(name)
+ return
+
+ util.helper_target(
+ java_binary,
+ name = name + "/bin",
+ srcs = ["Main.java"],
+ exclude_build_data = True,
+ )
+
+ analysis_test(
+ name = name,
+ impl = _test_java_binary_excludes_build_data_impl,
+ target = name + "/bin",
+ attr_values = {"tags": ["min_bazel_8"]},
+ )
+
+def _test_java_binary_excludes_build_data_impl(env, target):
+ assert_deploy_jar_action = env.expect.that_target(target).action_generating(
+ "{package}/{name}_deploy.jar",
+ )
+
+ assert_deploy_jar_action.argv().contains("--normalize")
+ assert_deploy_jar_action.argv().contains("--exclude_build_data")
+ assert_deploy_jar_action.argv().not_contains("--build_info_file")
+ assert_deploy_jar_action.inputs().not_contains_predicate(
+ matching.file_basename_equals("non_volatile_file.properties"),
+ )
+ assert_deploy_jar_action.inputs().not_contains_predicate(
+ matching.file_basename_equals("redacted_file.properties"),
+ )
+
+def _test_java_binary_stamping_enabled_build_data_excluded_fails(name):
+ if not _bazel_version_ge("8.0.0"):
+ always_passes(name)
+ return
+
+ util.helper_target(
+ java_binary,
+ name = name + "/bin",
+ srcs = ["Main.java"],
+ exclude_build_data = True,
+ stamp = 1,
+ )
+
+ analysis_test(
+ name = name,
+ impl = _test_java_binary_stamping_enabled_build_data_excluded_fails_impl,
+ target = name + "/bin",
+ expect_failure = True,
+ attr_values = {"tags": ["min_bazel_8"]},
+ )
+
+def _test_java_binary_stamping_enabled_build_data_excluded_fails_impl(env, target):
+ env.expect.that_target(target).failures().contains_predicate(
+ matching.str_matches("Enabling stamping has no effect with exclude_build_data enabled"),
+ )
+
def _test_java_binary_javacopts_make_variable_expansion(name):
util.helper_target(
template_var_info_rule,
@@ -137,6 +199,8 @@ def java_binary_tests(name):
name = name,
tests = [
_test_java_binary_cross_compilation_to_unix,
+ _test_java_binary_excludes_build_data,
+ _test_java_binary_stamping_enabled_build_data_excluded_fails,
_test_java_binary_javacopts_make_variable_expansion,
_test_java_binary_javacopts_location_expansion,
_test_java_binary_resource_strip_prefix,
diff --git a/test/java/common/rules/java_binary_tests.bzl b/test/java/common/rules/java_binary_tests.bzl
index 496a0053..b8add399 100644
--- a/test/java/common/rules/java_binary_tests.bzl
+++ b/test/java/common/rules/java_binary_tests.bzl
@@ -56,6 +56,9 @@ def _test_stamp_conversion_does_not_override_int_impl(env, target):
"{package}/{name}_deploy.jar",
)
+ assert_deploy_jar_action.argv().contains("--normalize")
+ assert_deploy_jar_action.argv().not_contains("--exclude_build_data")
+ assert_deploy_jar_action.argv().contains("--build_info_file")
assert_deploy_jar_action.inputs().not_contains_predicate(
matching.file_basename_equals("non_volatile_file.properties"),
)