diff options
author | 2017-01-12 09:24:35 +0000 | |
---|---|---|
committer | 2017-01-12 14:08:14 +0000 | |
commit | bbd1c1e001c39dec7eeeab16f1a619d3540ba959 (patch) | |
tree | 41904ec80df84e7b197568f6c8dadb0366b7260b /src/main/java | |
parent | 31e29d15448dfde032c4e519bc8707165be48e34 (diff) |
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
Diffstat (limited to 'src/main/java')
7 files changed, 83 insertions, 2 deletions
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 { </p> <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ .add(attr("resource_strip_prefix", STRING)) + /* <!-- #BLAZE_RULE($java_rule).ATTRIBUTE(resource_jars) --> + Set of archives containing Java resources. + <p> + If specified, the contents of these jars are merged into the output jar. + </p> + <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ + .add( + attr("resource_jars", LABEL_LIST) + .orderIndependent() + .allowedFileTypes(JavaSemantics.JAR)) /* <!-- #BLAZE_RULE($java_rule).ATTRIBUTE(plugins) --> Java compiler plugins to run at compile-time. Every <code>java_plugin</code> 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<PathFragment, Artifact> resources; + /** Jars that contain resources to be added to the Jack library. */ + private final NestedSet<Artifact> resourceJars; + /** Jack libraries to be provided to depending rules on the classpath, from srcs and exports. */ private final NestedSet<Artifact> exportedJacks; /** @@ -187,6 +190,7 @@ public final class JackCompilationHelper { ImmutableSet<Artifact> javaSources, ImmutableSet<Artifact> sourceJars, ImmutableMap<PathFragment, Artifact> resources, + NestedSet<Artifact> resourceJars, NestedSet<Artifact> processorClasspathJars, ImmutableSet<String> processorNames, NestedSet<Artifact> 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<Artifact> 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<Artifact> javaSources, Iterable<Artifact> sourceJars, Map<PathFragment, Artifact> resources, + NestedSet<Artifact> resourceJars, NestedSet<Artifact> 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<PathFragment, Artifact> resources = new LinkedHashMap<>(); + /** Set of resource jars that contain Java resources. */ + private final NestedSetBuilder<Artifact> resourceJars = NestedSetBuilder.stableOrder(); + /** Jack libraries to be provided to depending rules on the classpath, from srcs and exports. */ private final NestedSetBuilder<Artifact> exportedJackLibraries = new NestedSetBuilder<>(Order.NAIVE_LINK_ORDER); @@ -712,6 +726,11 @@ public final class JackCompilationHelper { return this; } + public JackCompilationHelper.Builder addResourceJars(NestedSet<Artifact> 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<Artifact> resources; + /** + * The set of resource jars to merge into the jar. + */ + private final NestedSet<Artifact> 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<Artifact> processorPath, List<String> processorNames, Map<PathFragment, Artifact> resources, + NestedSet<Artifact> resourceJars, Collection<Artifact> sourceJars, Collection<Artifact> sourceFiles, List<String> 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<Artifact> getResourceJars() { + return resourceJars; + } + /** * Returns the list of paths that represents the classpath. */ @@ -620,6 +632,7 @@ public final class JavaCompileAction extends AbstractAction { final List<String> processorNames, final Collection<Artifact> messages, final Map<PathFragment, Artifact> resources, + final NestedSet<Artifact> resourceJars, final Collection<Artifact> classpathResources, final Collection<Artifact> sourceJars, final Collection<Artifact> 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<Artifact> sourceFiles = new ArrayList<>(); private final Collection<Artifact> sourceJars = new ArrayList<>(); private final Map<PathFragment, Artifact> resources = new LinkedHashMap<>(); + private final NestedSetBuilder<Artifact> resourceJars = NestedSetBuilder.stableOrder(); private final Collection<Artifact> classpathResources = new ArrayList<>(); private final Collection<Artifact> translations = new LinkedHashSet<>(); private BuildConfiguration.StrictDepsMode strictJavaDeps = @@ -1061,6 +1078,8 @@ public final class JavaCompileAction extends AbstractAction { configuration.getBinDirectory(targetLabel.getPackageIdentifier().getRepository())); } + NestedSet<Artifact> 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<Artifact> resourceJars) { + this.resourceJars.addTransitive(resourceJars); + return this; + } + public Builder addClasspathResources(Collection<Artifact> 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<String> apiGeneratingProcessorNames = new LinkedHashSet<>(); private final Map<PathFragment, Artifact> resources = new LinkedHashMap<>(); + private final NestedSetBuilder<Artifact> resourceJars = NestedSetBuilder.stableOrder(); private final List<Artifact> messages = new ArrayList<>(); private final List<Artifact> instrumentationMetadata = new ArrayList<>(); private final List<Artifact> sourceJars = new ArrayList<>(); @@ -295,6 +296,12 @@ public class JavaTargetAttributes { return this; } + public Builder addResourceJars(NestedSet<Artifact> 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<String> apiGeneratingProcessorNames; private final ImmutableMap<PathFragment, Artifact> resources; + private final NestedSet<Artifact> resourceJars; + private final ImmutableList<Artifact> messages; private final ImmutableList<Artifact> sourceJars; @@ -445,6 +455,7 @@ public class JavaTargetAttributes { Set<Artifact> apiGeneratingProcessorPath, Set<String> apiGeneratingProcessorNames, Map<PathFragment, Artifact> resources, + NestedSet<Artifact> resourceJars, List<Artifact> messages, List<Artifact> sourceJars, List<Artifact> 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<Artifact> getResourceJars() { + return resourceJars; + } + public List<Artifact> getMessages() { return messages; } |