diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java index 4136510303ad4a..399f7afb5c2a3e 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.LauncherFileWriteAction; import com.google.devtools.build.lib.analysis.actions.LauncherFileWriteAction.LaunchInfo; +import com.google.devtools.build.lib.analysis.actions.LazyWritePathsFileAction; import com.google.devtools.build.lib.analysis.actions.Substitution; import com.google.devtools.build.lib.analysis.actions.Substitution.ComputedSubstitution; import com.google.devtools.build.lib.analysis.actions.Template; @@ -273,7 +274,8 @@ public Artifact createStubAction( javaStartClass, "", NestedSetBuilder.stableOrder(), - javaExecutable); + javaExecutable, + /* createCoverageMetadataJar= */ true); } @Override @@ -285,7 +287,8 @@ public Artifact createStubAction( String javaStartClass, String coverageStartClass, NestedSetBuilder filesBuilder, - String javaExecutable) { + String javaExecutable, + boolean createCoverageMetadataJar) { Preconditions.checkState(ruleContext.getConfiguration().hasFragment(JavaConfiguration.class)); Preconditions.checkNotNull(jvmFlags); @@ -348,8 +351,30 @@ public Artifact createStubAction( if (ruleContext.getConfiguration().isCodeCoverageEnabled() && ruleContext.getConfiguration().isExperimentalJavaCoverage()) { - // Remove the placeholder in the stub otherwise bazel coverage fails. - arguments.add(Substitution.of(JavaSemantics.JACOCO_METADATA_PLACEHOLDER, "")); + if (createCoverageMetadataJar) { + Artifact runtimeClassPathArtifact = + ruleContext.getUniqueDirectoryArtifact( + "coverage_runtime_classpath", + "runtime-classpath.txt", + ruleContext.getBinOrGenfilesDirectory()); + ruleContext.registerAction( + new LazyWritePathsFileAction( + ruleContext.getActionOwner(), + runtimeClassPathArtifact, + javaCommon.getRuntimeClasspath(), + true)); + filesBuilder.add(runtimeClassPathArtifact); + arguments.add( + Substitution.of( + JavaSemantics.JACOCO_METADATA_PLACEHOLDER, + "export JACOCO_METADATA_JAR=${JAVA_RUNFILES}/" + + workspacePrefix + + "/" + + runtimeClassPathArtifact.getRootRelativePathString())); + } else { + // Remove the placeholder in the stub otherwise bazel coverage fails. + arguments.add(Substitution.of(JavaSemantics.JACOCO_METADATA_PLACEHOLDER, "")); + } arguments.add(Substitution.of( JavaSemantics.JACOCO_MAIN_CLASS_PLACEHOLDER, "export JACOCO_MAIN_CLASS=" + coverageStartClass)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java index 9b74e523e9f117..606f26d487cf93 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java @@ -270,7 +270,8 @@ public ConfiguredTarget create(RuleContext ruleContext) mainClass, originalMainClass, filesToBuildBuilder, - javaExecutable); + javaExecutable, + /* createCoverageMetadataJar= */ true); Artifact oneVersionOutputArtifact = null; JavaConfiguration javaConfig = ruleContext.getFragment(JavaConfiguration.class); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java index 250656e4a2dafb..98a6967d9ae4c0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java @@ -292,7 +292,8 @@ public ConfiguredTarget create(RuleContext ruleContext) mainClass, originalMainClass, filesBuilder, - javaExecutable); + javaExecutable, + /* createCoverageMetadataJar= */ false); if (!executableToRun.equals(executableForRunfiles)) { filesBuilder.add(executableToRun); runfilesBuilder.addArtifact(executableToRun); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java index c407385fc4930a..674d6585f6ddea 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java @@ -310,7 +310,8 @@ public Artifact createStubAction( String javaStartClass, String coverageStartClass, NestedSetBuilder filesBuilder, - String javaExecutable) + String javaExecutable, + boolean createCoverageMetadataJar) throws InterruptedException; /**