aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2017-01-12 09:24:35 +0000
committerGravatar Marcel Hlopko <hlopko@google.com>2017-01-12 14:08:14 +0000
commitbbd1c1e001c39dec7eeeab16f1a619d3540ba959 (patch)
tree41904ec80df84e7b197568f6c8dadb0366b7260b /src/main/java
parent31e29d15448dfde032c4e519bc8707165be48e34 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/JackCompilationHelper.java24
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java27
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java16
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;
}