From bbd1c1e001c39dec7eeeab16f1a619d3540ba959 Mon Sep 17 00:00:00 2001 From: Lukacs Berki Date: Thu, 12 Jan 2017 09:24:35 +0000 Subject: Add a java_{library,binary}.resource_jars attribute that allows one to specify jar files containing Java resources. -- PiperOrigin-RevId: 144299119 MOS_MIGRATED_REVID=144299119 --- .../lib/bazel/rules/java/BazelJavaRuleClasses.java | 10 ++++++++ .../build/lib/rules/android/AndroidCommon.java | 1 + .../lib/rules/android/JackCompilationHelper.java | 24 +++++++++++++++++-- .../devtools/build/lib/rules/java/JavaCommon.java | 6 +++++ .../lib/rules/java/JavaCompilationHelper.java | 1 + .../build/lib/rules/java/JavaCompileAction.java | 27 ++++++++++++++++++++++ .../build/lib/rules/java/JavaTargetAttributes.java | 16 +++++++++++++ 7 files changed, 83 insertions(+), 2 deletions(-) (limited to 'src/main/java/com/google') diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java index 38a4b8297b..16742392ac 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java @@ -246,6 +246,16 @@ public class BazelJavaRuleClasses {

*/ .add(attr("resource_strip_prefix", STRING)) + /* + Set of archives containing Java resources. +

+ If specified, the contents of these jars are merged into the output jar. +

+ */ + .add( + attr("resource_jars", LABEL_LIST) + .orderIndependent() + .allowedFileTypes(JavaSemantics.JAR)) /* Java compiler plugins to run at compile-time. Every java_plugin specified in this attribute will be run whenever this rule diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index 7045816c7d..a14159f0b3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java @@ -635,6 +635,7 @@ public class AndroidCommon { .addJavaSources(attributes.getSourceFiles()) .addSourceJars(attributes.getSourceJars()) .addResources(attributes.getResources()) + .addResourceJars(attributes.getResourceJars()) .addProcessorNames(attributes.getProcessorNames()) .addProcessorClasspathJars(attributes.getProcessorPath()) .addExports(JavaCommon.getExports(ruleContext)) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java index 87e3443163..efc8da71c8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java @@ -139,6 +139,9 @@ public final class JackCompilationHelper { /** Java resources for the rule's Jack library. */ private final ImmutableMap resources; + /** Jars that contain resources to be added to the Jack library. */ + private final NestedSet resourceJars; + /** Jack libraries to be provided to depending rules on the classpath, from srcs and exports. */ private final NestedSet exportedJacks; /** @@ -187,6 +190,7 @@ public final class JackCompilationHelper { ImmutableSet javaSources, ImmutableSet sourceJars, ImmutableMap resources, + NestedSet resourceJars, NestedSet processorClasspathJars, ImmutableSet processorNames, NestedSet exportedJacks, @@ -206,6 +210,7 @@ public final class JackCompilationHelper { this.javaSources = javaSources; this.sourceJars = sourceJars; this.resources = resources; + this.resourceJars = resourceJars; this.processorClasspathJars = processorClasspathJars; this.processorNames = processorNames; this.exportedJacks = exportedJacks; @@ -349,11 +354,12 @@ public final class JackCompilationHelper { NestedSetBuilder dexContents = new NestedSetBuilder<>(Order.NAIVE_LINK_ORDER); if (outputArtifact != null) { - if (javaSources.isEmpty() && sourceJars.isEmpty() && resources.isEmpty()) { + if (javaSources.isEmpty() && sourceJars.isEmpty() && resources.isEmpty() + && resourceJars.isEmpty()) { // We still have to create SOMETHING to fulfill the artifact, but man, screw it buildEmptyJackAction(); } else { - buildJackAction(javaSources, sourceJars, resources, classpath); + buildJackAction(javaSources, sourceJars, resources, resourceJars, classpath); exports.add(outputArtifact); dexContents.add(outputArtifact); } @@ -485,6 +491,7 @@ public final class JackCompilationHelper { Iterable javaSources, Iterable sourceJars, Map resources, + NestedSet resourceJars, NestedSet classpathJackLibraries) { CustomCommandLine.Builder builder = CustomCommandLine.builder() @@ -517,6 +524,9 @@ public final class JackCompilationHelper { builder.addPaths("%s:%s", rootPrefix, resourcePath); } } + if (!resourceJars.isEmpty()) { + builder.addJoinExecPaths(IMPORT_RESOURCE_ZIP, ":", resourceJars); + } builder.addBeforeEachExecPath(IMPORT_SOURCE_ZIP, sourceJars).addExecPaths(javaSources); ruleContext.registerAction( new SpawnAction.Builder() @@ -525,6 +535,7 @@ public final class JackCompilationHelper { .addOutput(outputArtifact) .addTransitiveInputs(processorClasspathJars) .addInputs(resources.values()) + .addTransitiveInputs(resourceJars) .addInputs(sourceJars) .addInputs(javaSources) .setCommandLine(builder.build()) @@ -567,6 +578,9 @@ public final class JackCompilationHelper { /** Map from paths within the Jack library to Java resources for the rule's Jack library. */ private final LinkedHashMap resources = new LinkedHashMap<>(); + /** Set of resource jars that contain Java resources. */ + private final NestedSetBuilder resourceJars = NestedSetBuilder.stableOrder(); + /** Jack libraries to be provided to depending rules on the classpath, from srcs and exports. */ private final NestedSetBuilder exportedJackLibraries = new NestedSetBuilder<>(Order.NAIVE_LINK_ORDER); @@ -712,6 +726,11 @@ public final class JackCompilationHelper { return this; } + public JackCompilationHelper.Builder addResourceJars(NestedSet resourceJars) { + this.resourceJars.addTransitive(resourceJars); + return this; + } + /** * Adds a set of class names which will be used as annotation processors. */ @@ -867,6 +886,7 @@ public final class JackCompilationHelper { ImmutableSet.copyOf(javaSources), ImmutableSet.copyOf(sourceJars), ImmutableMap.copyOf(resources), + resourceJars.build(), processorClasspathJars.build(), ImmutableSet.copyOf(processorNames), exportedJackLibraries.build(), diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java index e2d9111ec8..cc1ebed2eb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.AnalysisEnvironment; import com.google.devtools.build.lib.analysis.AnalysisUtils; import com.google.devtools.build.lib.analysis.OutputGroupProvider; +import com.google.devtools.build.lib.analysis.PrerequisiteArtifacts; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; @@ -589,6 +590,11 @@ public class JavaCommon { JavaHelper.getJavaResourcePath(semantics, ruleContext, resource), resource); } + if (ruleContext.attributes().has("resource_jars", BuildType.LABEL_LIST)) { + javaTargetAttributes.addResourceJars(PrerequisiteArtifacts.nestedSet( + ruleContext, "resource_jars", Mode.TARGET)); + } + addPlugins(javaTargetAttributes); javaTargetAttributes.setRuleKind(ruleContext.getRule().getRuleClass()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java index 58dd7363e4..342b9bac68 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java @@ -173,6 +173,7 @@ public final class JavaCompilationHelper { JavaCompileAction.Builder builder = createJavaCompileActionBuilder(semantics); builder.setClasspathEntries(attributes.getCompileTimeClassPath()); builder.addResources(attributes.getResources()); + builder.addResourceJars(attributes.getResourceJars()); builder.addClasspathResources(attributes.getClassPathResources()); builder.setBootclasspathEntries(getBootclasspathOrDefault()); builder.setExtdirInputs(getExtdirInputs()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java index d79040c4be..67c3d151b1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java @@ -144,6 +144,11 @@ public final class JavaCompileAction extends AbstractAction { */ private final ImmutableList resources; + /** + * The set of resource jars to merge into the jar. + */ + private final NestedSet resourceJars; + /** The number of resources that will be put into the jar. */ private final int resourceCount; @@ -221,6 +226,7 @@ public final class JavaCompileAction extends AbstractAction { List processorPath, List processorNames, Map resources, + NestedSet resourceJars, Collection sourceJars, Collection sourceFiles, List javacOpts, @@ -253,6 +259,7 @@ public final class JavaCompileAction extends AbstractAction { this.processorPath = ImmutableList.copyOf(processorPath); this.processorNames = ImmutableList.copyOf(processorNames); this.resources = ImmutableList.copyOf(resources.values()); + this.resourceJars = resourceJars; this.sourceJars = ImmutableList.copyOf(sourceJars); this.sourceFiles = ImmutableList.copyOf(sourceFiles); this.javacOpts = ImmutableList.copyOf(javacOpts); @@ -283,6 +290,11 @@ public final class JavaCompileAction extends AbstractAction { return resources; } + @VisibleForTesting + public NestedSet getResourceJars() { + return resourceJars; + } + /** * Returns the list of paths that represents the classpath. */ @@ -620,6 +632,7 @@ public final class JavaCompileAction extends AbstractAction { final List processorNames, final Collection messages, final Map resources, + final NestedSet resourceJars, final Collection classpathResources, final Collection sourceJars, final Collection sourceFiles, @@ -688,6 +701,9 @@ public final class JavaCompileAction extends AbstractAction { addAsResourcePrefixedExecPath(resource.getKey(), resource.getValue(), result); } } + if (!resourceJars.isEmpty()) { + result.addExecPaths("--resource_jars", resourceJars); + } if (!classpathResources.isEmpty()) { result.addExecPaths("--classpath_resources", classpathResources); } @@ -941,6 +957,7 @@ public final class JavaCompileAction extends AbstractAction { private final Collection sourceFiles = new ArrayList<>(); private final Collection sourceJars = new ArrayList<>(); private final Map resources = new LinkedHashMap<>(); + private final NestedSetBuilder resourceJars = NestedSetBuilder.stableOrder(); private final Collection classpathResources = new ArrayList<>(); private final Collection translations = new LinkedHashSet<>(); private BuildConfiguration.StrictDepsMode strictJavaDeps = @@ -1061,6 +1078,8 @@ public final class JavaCompileAction extends AbstractAction { configuration.getBinDirectory(targetLabel.getPackageIdentifier().getRepository())); } + NestedSet resourceJars = this.resourceJars.build(); + // ImmutableIterable is safe to use here because we know that none of the components of // the Iterable.concat() will change. Without ImmutableIterable, AbstractAction will // waste memory by making a preventive copy of the iterable. @@ -1068,6 +1087,7 @@ public final class JavaCompileAction extends AbstractAction { processorPath, translations, resources.values(), + resourceJars, sourceJars, sourceFiles, classpathResources, @@ -1107,6 +1127,7 @@ public final class JavaCompileAction extends AbstractAction { processorNames, translations, resources, + resourceJars, classpathResources, sourceJars, sourceFiles, @@ -1180,6 +1201,7 @@ public final class JavaCompileAction extends AbstractAction { processorPath, processorNames, resources, + resourceJars, sourceJars, sourceFiles, internedJcopts, @@ -1257,6 +1279,11 @@ public final class JavaCompileAction extends AbstractAction { return this; } + public Builder addResourceJars(NestedSet resourceJars) { + this.resourceJars.addTransitive(resourceJars); + return this; + } + public Builder addClasspathResources(Collection classpathResources) { this.classpathResources.addAll(classpathResources); return this; diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java index 4f996ad095..f1775189a3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java @@ -79,6 +79,7 @@ public class JavaTargetAttributes { private final Set apiGeneratingProcessorNames = new LinkedHashSet<>(); private final Map resources = new LinkedHashMap<>(); + private final NestedSetBuilder resourceJars = NestedSetBuilder.stableOrder(); private final List messages = new ArrayList<>(); private final List instrumentationMetadata = new ArrayList<>(); private final List sourceJars = new ArrayList<>(); @@ -295,6 +296,12 @@ public class JavaTargetAttributes { return this; } + public Builder addResourceJars(NestedSet resourceJars) { + Preconditions.checkArgument(!built); + this.resourceJars.addTransitive(resourceJars); + return this; + } + public Builder addProcessorName(String processor) { Preconditions.checkArgument(!built); processorNames.add(processor); @@ -361,6 +368,7 @@ public class JavaTargetAttributes { apiGeneratingProcessorPath, apiGeneratingProcessorNames, resources, + resourceJars.build(), messages, sourceJars, classPathResources, @@ -416,6 +424,8 @@ public class JavaTargetAttributes { private final ImmutableSet apiGeneratingProcessorNames; private final ImmutableMap resources; + private final NestedSet resourceJars; + private final ImmutableList messages; private final ImmutableList sourceJars; @@ -445,6 +455,7 @@ public class JavaTargetAttributes { Set apiGeneratingProcessorPath, Set apiGeneratingProcessorNames, Map resources, + NestedSet resourceJars, List messages, List sourceJars, List classPathResources, @@ -472,6 +483,7 @@ public class JavaTargetAttributes { this.apiGeneratingProcessorPath = ImmutableSet.copyOf(apiGeneratingProcessorPath); this.apiGeneratingProcessorNames = ImmutableSet.copyOf(apiGeneratingProcessorNames); this.resources = ImmutableMap.copyOf(resources); + this.resourceJars = resourceJars; this.messages = ImmutableList.copyOf(messages); this.sourceJars = ImmutableList.copyOf(sourceJars); this.classPathResources = ImmutableList.copyOf(classPathResources); @@ -499,6 +511,10 @@ public class JavaTargetAttributes { return resources; } + public NestedSet getResourceJars() { + return resourceJars; + } + public List getMessages() { return messages; } -- cgit v1.2.3