diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java index 37e5def223854a..97c0f9370ccc51 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaConfiguration.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.collect.nestedset.Depset; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.packages.BuiltinRestriction; import com.google.devtools.build.lib.starlarkbuildapi.java.JavaConfigurationApi; import java.util.Map; import javax.annotation.Nullable; @@ -113,6 +114,7 @@ public enum ImportDepsCheckingLevel { private final boolean multiReleaseDeployJars; private final boolean disallowJavaImportExports; private final boolean disallowJavaImportEmptyJars; + private final boolean autoCreateDeployJarForJavaTests; // TODO(dmarting): remove once we have a proper solution for #2539 private final boolean useLegacyBazelJavaTest; @@ -153,7 +155,7 @@ public JavaConfiguration(BuildOptions buildOptions) throws InvalidConfigurationE this.multiReleaseDeployJars = javaOptions.multiReleaseDeployJars; this.disallowJavaImportExports = javaOptions.disallowJavaImportExports; this.disallowJavaImportEmptyJars = javaOptions.disallowJavaImportEmptyJars; - + this.autoCreateDeployJarForJavaTests = javaOptions.autoCreateDeployJarForJavaTests; Map optimizers = javaOptions.bytecodeOptimizers; if (optimizers.size() != 1) { throw new InvalidConfigurationException( @@ -546,4 +548,9 @@ public boolean experimentalEnableJspecify() { return experimentalEnableJspecify; } + @Override + public boolean autoCreateJavaTestDeployJars(StarlarkThread thread) throws EvalException { + BuiltinRestriction.failIfCalledOutsideBuiltins(thread); + return autoCreateDeployJarForJavaTests; + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java index 91d7378b252cb7..85b814e46b5209 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaOptions.java @@ -590,4 +590,12 @@ public ImportDepsCheckingLevelConverter() { effectTags = {OptionEffectTag.UNKNOWN}, help = "Enable experimental jspecify integration.") public boolean experimentalEnableJspecify; + + @Option( + name = "experimental_java_test_auto_create_deploy_jar", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = {OptionEffectTag.UNKNOWN}, + help = "DO NOT USE") + public boolean autoCreateDeployJarForJavaTests; } diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaConfigurationApi.java index 9bbf7ebdca5c40..8a6b7d7a82e3c2 100644 --- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaConfigurationApi.java +++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaConfigurationApi.java @@ -156,4 +156,10 @@ public interface JavaConfigurationApi extends StarlarkValue { + " a *.pgcfg extension.", documented = false) boolean enforceProguardFileExtension(); + + @StarlarkMethod( + name = "auto_create_java_test_deploy_jars", + useStarlarkThread = true, + documented = false) + boolean autoCreateJavaTestDeployJars(StarlarkThread thread) throws EvalException; } diff --git a/src/main/starlark/builtins_bzl/common/java/java_binary.bzl b/src/main/starlark/builtins_bzl/common/java/java_binary.bzl index 4450b6e9bc6e2a..31427f7b13b8f0 100644 --- a/src/main/starlark/builtins_bzl/common/java/java_binary.bzl +++ b/src/main/starlark/builtins_bzl/common/java/java_binary.bzl @@ -19,6 +19,7 @@ load(":common/cc/cc_info.bzl", "CcInfo") load(":common/cc/semantics.bzl", cc_semantics = "semantics") load(":common/java/basic_java_library.bzl", "BASIC_JAVA_LIBRARY_IMPLICIT_ATTRS", "basic_java_library", "collect_deps") load(":common/java/boot_class_path_info.bzl", "BootClassPathInfo") +load(":common/java/java_binary_deploy_jar.bzl", "create_deploy_archive") load(":common/java/java_common.bzl", "java_common") load( ":common/java/java_common_internal_for_builtins.bzl", @@ -275,8 +276,31 @@ def basic_java_binary( java_binary_info = to_java_binary_info(java_info, compilation_info) + internal_deploy_jar_info = InternalDeployJarInfo( + java_attrs = java_attrs, + launcher_info = struct( + runtime_jars = launcher_info.runtime_jars, + launcher = launcher_info.launcher, + unstripped_launcher = launcher_info.unstripped_launcher, + ), + shared_archive = shared_archive, + main_class = main_class, + coverage_main_class = coverage_main_class, + strip_as_default = strip_as_default, + stamp = ctx.attr.stamp, + hermetic = hasattr(ctx.attr, "hermetic") and ctx.attr.hermetic, + add_exports = add_exports, + add_opens = add_opens, + manifest_lines = ctx.attr.deploy_manifest_lines, + ) + + # "temporary" workaround for https://github.com/bazelbuild/intellij/issues/5845 + extra_files = [] + if is_test_rule_class and ctx.fragments.java.auto_create_java_test_deploy_jars(): + extra_files.append(_auto_create_deploy_jar(ctx, internal_deploy_jar_info)) + default_info = struct( - files = files, + files = depset(extra_files, transitive = [files]), runfiles = runfiles, executable = executable, ) @@ -286,23 +310,7 @@ def basic_java_binary( "JavaInfo": java_binary_info, "InstrumentedFilesInfo": target["InstrumentedFilesInfo"], "JavaRuntimeClasspathInfo": java_common.JavaRuntimeClasspathInfo(runtime_classpath = java_info.transitive_runtime_jars), - "InternalDeployJarInfo": InternalDeployJarInfo( - java_attrs = java_attrs, - launcher_info = struct( - runtime_jars = launcher_info.runtime_jars, - launcher = launcher_info.launcher, - unstripped_launcher = launcher_info.unstripped_launcher, - ), - shared_archive = shared_archive, - main_class = main_class, - coverage_main_class = coverage_main_class, - strip_as_default = strip_as_default, - stamp = ctx.attr.stamp, - hermetic = hasattr(ctx.attr, "hermetic") and ctx.attr.hermetic, - add_exports = add_exports, - add_opens = add_opens, - manifest_lines = ctx.attr.deploy_manifest_lines, - ), + "InternalDeployJarInfo": internal_deploy_jar_info, }, default_info, jvm_flags def _collect_attrs(ctx, runtime_classpath, classpath_resources): @@ -490,6 +498,43 @@ def _get_validations_from_target(target): else: return depset() +# TODO: bazelbuild/intellij/issues/5845 - remove this once no longer required +# this need not be completely identical to the regular deploy jar since we only +# care about packaging the classpath +def _auto_create_deploy_jar(ctx, info): + output = ctx.actions.declare_file(ctx.label.name + "_auto_deploy.jar") + java_attrs = info.java_attrs + runtime_classpath = depset( + direct = info.launcher_info.runtime_jars, + transitive = [ + java_attrs.runtime_jars, + java_attrs.runtime_classpath_for_archive, + ], + order = "preorder", + ) + create_deploy_archive( + ctx, + launcher = info.launcher_info.launcher, + runfiles = depset(), + main_class = info.main_class, + coverage_main_class = info.coverage_main_class, + resources = java_attrs.resources, + classpath_resources = java_attrs.classpath_resources, + runtime_classpath = runtime_classpath, + manifest_lines = info.manifest_lines, + build_info_files = [], + build_target = str(ctx.label), + output = output, + shared_archive = info.shared_archive, + one_version_level = ctx.fragments.java.one_version_enforcement_level, + one_version_allowlist = helper.check_and_get_one_version_attribute(ctx, "_one_version_allowlist"), + multi_release = ctx.fragments.java.multi_release_deploy_jars, + hermetic = info.hermetic, + add_exports = info.add_exports, + add_opens = info.add_opens, + ) + return output + BASIC_JAVA_BINARY_ATTRIBUTES = merge_attrs( BASIC_JAVA_LIBRARY_IMPLICIT_ATTRS, {