Introduce --experimental_inmemory_jdeps_files. This is equivalent to C++'s
--experimental_inmemory_dotd_files and has the goal of transfering the data of
the .jdeps files generated for a Java compilation in memory if possible. These
.jdeps artifacts aren't currently used in anyway other than to determine
whether a fallback is necessary for --experimental_java_classpath=bazel.

RELNOTES: None.
PiperOrigin-RevId: 234985667
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 7a84702..4d15e1d 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
@@ -58,6 +58,7 @@
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider.ClasspathType;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
 import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
+import com.google.devtools.build.lib.rules.java.JavaCompileAction;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaPluginInfoProvider;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
@@ -623,14 +624,10 @@
 
     nativeHeaderOutput = helper.createNativeHeaderJar(classJar);
 
-    outputDepsProto = helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder);
-    helper.createCompileActionWithInstrumentation(
-        classJar,
-        manifestProtoOutput,
-        genSourceJar,
-        outputDepsProto,
-        javaArtifactsBuilder,
-        nativeHeaderOutput);
+    JavaCompileAction javaCompileAction =
+        helper.createCompileActionWithInstrumentation(
+            classJar, manifestProtoOutput, genSourceJar, javaArtifactsBuilder, nativeHeaderOutput);
+    outputDepsProto = javaCompileAction.getOutputDepsProto();
 
     if (generateExtensionRegistry) {
       generatedExtensionRegistryProvider =
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 d48e38c..606f26d 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
@@ -47,6 +47,7 @@
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider.ClasspathType;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
 import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
+import com.google.devtools.build.lib.rules.java.JavaCompileAction;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
 import com.google.devtools.build.lib.rules.java.JavaHelper;
@@ -239,18 +240,16 @@
       genSourceJar = helper.createGensrcJar(classJar);
       helper.createGenJarAction(classJar, manifestProtoOutput, genClassJar);
     }
-    Artifact outputDepsProtoArtifact =
-        helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder);
-    javaRuleOutputJarsProviderBuilder.setJdeps(outputDepsProtoArtifact);
 
-    helper.createCompileAction(
-        classJar,
-        manifestProtoOutput,
-        genSourceJar,
-        outputDepsProtoArtifact,
-        instrumentationMetadata,
-        /* nativeHeaderOutput= */ null);
+    JavaCompileAction javaCompileAction =
+        helper.createCompileAction(
+            classJar,
+            manifestProtoOutput,
+            genSourceJar,
+            instrumentationMetadata,
+            /* nativeHeaderOutput= */ null);
     helper.createSourceJarAction(srcJar, genSourceJar);
+    javaRuleOutputJarsProviderBuilder.setJdeps(javaCompileAction.getOutputDepsProto());
 
     setUpJavaCommon(javaCommon, helper, javaArtifactsBuilder.build());
 
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 e94868d..98a6967 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
@@ -236,9 +236,6 @@
             javaArtifactsBuilder,
             ruleOutputJarsProviderBuilder,
             javaSourceJarsProviderBuilder);
-    Artifact outputDepsProto = helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder);
-    ruleOutputJarsProviderBuilder.setJdeps(outputDepsProto);
-
     JavaCompilationArtifacts javaArtifacts = javaArtifactsBuilder.build();
     common.setJavaCompilationArtifacts(javaArtifacts);
 
@@ -252,14 +249,15 @@
       helper.createGenJarAction(classJar, manifestProtoOutput, genClassJar);
     }
 
-    helper.createCompileAction(
-        classJar,
-        manifestProtoOutput,
-        genSourceJar,
-        outputDepsProto,
-        instrumentationMetadata,
-        /* nativeHeaderOutput= */ null);
+    JavaCompileAction javaCompileAction =
+        helper.createCompileAction(
+            classJar,
+            manifestProtoOutput,
+            genSourceJar,
+            instrumentationMetadata,
+            /* nativeHeaderOutput= */ null);
     helper.createSourceJarAction(srcJar, genSourceJar);
+    ruleOutputJarsProviderBuilder.setJdeps(javaCompileAction.getOutputDepsProto());
 
     common.setClassPathFragment(
         new ClasspathConfiguredFragment(
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 e2c81c4..252d1ca 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
@@ -197,11 +197,10 @@
    *     --experimental_java_coverage is true).
    * @param nativeHeaderOutput an archive of generated native header files.
    */
-  public void createCompileAction(
+  public JavaCompileAction createCompileAction(
       Artifact outputJar,
       Artifact manifestProtoOutput,
       @Nullable Artifact gensrcOutputJar,
-      @Nullable Artifact outputDepsProto,
       @Nullable Artifact instrumentationMetadataJar,
       @Nullable Artifact nativeHeaderOutput) {
 
@@ -242,7 +241,7 @@
     builder.setNativeHeaderOutput(nativeHeaderOutput);
     builder.setManifestProtoOutput(manifestProtoOutput);
     builder.setGensrcOutputJar(gensrcOutputJar);
-    builder.setOutputDepsProto(outputDepsProto);
+    builder.setOutputDepsProto(getOutputDepsProtoPath(classJar));
     builder.setAdditionalOutputs(attributes.getAdditionalOutputs());
     builder.setMetadata(instrumentationMetadataJar);
     builder.setInstrumentationJars(jacocoInstrumentation);
@@ -264,7 +263,7 @@
     builder.setTargetLabel(
         attributes.getTargetLabel() == null ? ruleContext.getLabel() : attributes.getTargetLabel());
     builder.setInjectingRuleKind(attributes.getInjectingRuleKind());
-    builder.build(ruleContext, semantics);
+    return builder.build(ruleContext, semantics);
   }
 
   private ImmutableMap<String, String> getExecutionInfo() {
@@ -327,22 +326,19 @@
    * @param outputJar the class jar Artifact to create with the Action
    * @param manifestProtoOutput the output artifact for the manifest proto emitted from JavaBuilder
    * @param gensrcJar the generated sources jar Artifact to create with the Action
-   * @param outputDepsProto the compiler-generated jdeps file to create with the Action
    * @param javaArtifactsBuilder the build to store the instrumentation metadata in
    * @param nativeHeaderOutput an archive of generated native header files.
    */
-  public void createCompileActionWithInstrumentation(
+  public JavaCompileAction createCompileActionWithInstrumentation(
       Artifact outputJar,
       Artifact manifestProtoOutput,
       @Nullable Artifact gensrcJar,
-      @Nullable Artifact outputDepsProto,
       JavaCompilationArtifacts.Builder javaArtifactsBuilder,
       @Nullable Artifact nativeHeaderOutput) {
-    createCompileAction(
+    return createCompileAction(
         outputJar,
         manifestProtoOutput,
         gensrcJar,
-        outputDepsProto,
         createInstrumentationMetadata(outputJar, javaArtifactsBuilder),
         nativeHeaderOutput);
   }
@@ -568,26 +564,17 @@
   }
 
   /**
-   * Creates the jdeps file artifact if needed. Returns null if the target can't emit dependency
+   * Creates the jdeps file path if needed. Returns null if the target can't emit dependency
    * information (i.e there is no compilation step, the target acts as an alias).
    *
    * @param outputJar output jar artifact used to derive the name
    * @return the jdeps file artifact or null if the target can't generate such a file
    */
-  public Artifact createOutputDepsProtoArtifact(
-      Artifact outputJar, JavaCompilationArtifacts.Builder builder) {
+  public PathFragment getOutputDepsProtoPath(Artifact outputJar) {
     if (!generatesOutputDeps()) {
       return null;
     }
-
-    Artifact outputDepsProtoArtifact =
-        getRuleContext()
-            .getDerivedArtifact(
-                FileSystemUtils.replaceExtension(outputJar.getRootRelativePath(), ".jdeps"),
-                outputJar.getRoot());
-
-    builder.setCompileTimeDependencies(outputDepsProtoArtifact);
-    return outputDepsProtoArtifact;
+    return FileSystemUtils.replaceExtension(outputJar.getExecPath(), ".jdeps");
   }
 
   /**
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 57ed513..db44244 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
@@ -95,11 +95,12 @@
   private final ImmutableList<Artifact> sourceJars;
   private final JavaPluginInfo plugins;
 
+  private final ImmutableList<? extends ActionInput> outputFiles;
   private final NestedSet<Artifact> directJars;
   private final NestedSet<Artifact> mandatoryInputs;
   private final NestedSet<Artifact> transitiveInputs;
   private final NestedSet<Artifact> dependencyArtifacts;
-  private final Artifact outputDepsProto;
+  private final ActionInput outputDepsProto;
   private final JavaClasspathMode classpathMode;
 
   private final JavaCompileExtraActionInfoSupplier extraActionInfoSupplier;
@@ -122,7 +123,7 @@
       CommandLine flagLine,
       BuildConfiguration configuration,
       NestedSet<Artifact> dependencyArtifacts,
-      Artifact outputDepsProto,
+      ActionInput outputDepsProto,
       JavaClasspathMode classpathMode) {
     super(
         owner,
@@ -147,6 +148,12 @@
     this.dependencyArtifacts = dependencyArtifacts;
     this.outputDepsProto = outputDepsProto;
     this.classpathMode = classpathMode;
+    ImmutableList.Builder<ActionInput> outputsBuilder = ImmutableList.builder();
+    outputsBuilder.addAll(outputs);
+    if (outputDepsProto != null) {
+      outputsBuilder.add(outputDepsProto);
+    }
+    outputFiles = outputsBuilder.build();
   }
 
   @Override
@@ -297,7 +304,12 @@
               spawnActionContext.exec(
                   getReducedSpawn(actionExecutionContext, reducedClasspath, /* fallback= */ false),
                   actionExecutionContext);
-          try (InputStream input = outputDepsProto.getPath().getInputStream()) {
+
+          SpawnResult spawnResult = Iterables.getOnlyElement(results);
+          try (InputStream input =
+              (outputDepsProto instanceof Artifact)
+                  ? ((Artifact) outputDepsProto).getPath().getInputStream()
+                  : spawnResult.getInMemoryOutput(outputDepsProto)) {
             if (!Deps.Dependencies.parseFrom(input).getRequiresReducedClasspathFallback()) {
               return ActionResult.create(results);
             }
@@ -406,6 +418,11 @@
     public Iterable<? extends ActionInput> getInputFiles() {
       return inputs;
     }
+
+    @Override
+    public Collection<? extends ActionInput> getOutputFiles() {
+      return outputFiles;
+    }
   }
 
   @VisibleForTesting
@@ -463,4 +480,8 @@
   public Iterable<Artifact> getPossibleInputsForTesting() {
     return null;
   }
+
+  public Artifact getOutputDepsProto() {
+    return (outputDepsProto instanceof Artifact) ? (Artifact) outputDepsProto : null;
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilder.java
index f5079df..e6b64cc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileActionBuilder.java
@@ -24,8 +24,11 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.ActionEnvironment;
+import com.google.devtools.build.lib.actions.ActionInput;
+import com.google.devtools.build.lib.actions.ActionInputHelper;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.EmptyRunfilesSupplier;
+import com.google.devtools.build.lib.actions.ExecutionRequirements;
 import com.google.devtools.build.lib.actions.RunfilesSupplier;
 import com.google.devtools.build.lib.actions.extra.ExtraActionInfo;
 import com.google.devtools.build.lib.actions.extra.JavaCompileInfo;
@@ -46,6 +49,7 @@
 import com.google.devtools.build.lib.rules.java.JavaPluginInfoProvider.JavaPluginInfo;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.util.StringCanonicalizer;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -138,7 +142,7 @@
   private Artifact nativeHeaderOutput;
   private Artifact gensrcOutputJar;
   private Artifact manifestProtoOutput;
-  private Artifact outputDepsProto;
+  private PathFragment outputDepsProto;
   private Collection<Artifact> additionalOutputs;
   private Artifact metadata;
   private Artifact artifactForExperimentalCoverage;
@@ -169,7 +173,7 @@
   private Label targetLabel;
   @Nullable private String injectingRuleKind;
 
-  public void build(RuleContext ruleContext, JavaSemantics javaSemantics) {
+  public JavaCompileAction build(RuleContext ruleContext, JavaSemantics javaSemantics) {
     // TODO(bazel-team): all the params should be calculated before getting here, and the various
     // aggregation code below should go away.
     ImmutableList<String> internedJcopts =
@@ -197,7 +201,6 @@
             metadata,
             gensrcOutputJar,
             manifestProtoOutput,
-            outputDepsProto,
             nativeHeaderOutput)
         .filter(x -> x != null)
         .forEachOrdered(outputs::add);
@@ -284,6 +287,26 @@
       classpathMode = JavaClasspathMode.OFF;
     }
 
+    ActionInput outputDepsProtoInput = null;
+    if (outputDepsProto != null) {
+      if (javaConfiguration.inmemoryJdepsFiles()) {
+        outputDepsProtoInput = ActionInputHelper.fromPath(outputDepsProto.getSafePathString());
+        executionInfo =
+            ImmutableMap.<String, String>builderWithExpectedSize(this.executionInfo.size() + 1)
+                .putAll(this.executionInfo)
+                .put(
+                    ExecutionRequirements.REMOTE_EXECUTION_INLINE_OUTPUTS,
+                    outputDepsProtoInput.getExecPathString())
+                .build();
+      } else {
+        Artifact outputDepsProtoArtifact =
+            ruleContext.getDerivedArtifact(
+                FileSystemUtils.replaceExtension(outputJar.getRootRelativePath(), ".jdeps"),
+                outputJar.getRoot());
+        outputDepsProtoInput = outputDepsProtoArtifact;
+        outputs.add(outputDepsProtoArtifact);
+      }
+    }
     NestedSet<Artifact> tools = toolsBuilder.build();
     mandatoryInputs.addTransitive(tools);
     JavaCompileAction javaCompileAction =
@@ -305,9 +328,10 @@
             /* flagLine= */ buildParamFileContents(ruleContext.getConfiguration(), internedJcopts),
             /* configuration= */ ruleContext.getConfiguration(),
             /* dependencyArtifacts= */ compileTimeDependencyArtifacts,
-            /* outputDepsProto= */ outputDepsProto,
+            /* outputDepsProto= */ outputDepsProtoInput,
             /* classpathMode= */ classpathMode);
     ruleContext.getAnalysisEnvironment().registerAction(javaCompileAction);
+    return javaCompileAction;
   }
 
   private CustomCommandLine buildParamFileContents(
@@ -327,7 +351,7 @@
     if (compressJar) {
       result.add("--compress_jar");
     }
-    result.addExecPath("--output_deps_proto", outputDepsProto);
+    result.addPath("--output_deps_proto", outputDepsProto);
     result.addExecPaths("--extclasspath", extdirInputs);
     result.addExecPaths("--bootclasspath", bootclasspathEntries);
     result.addExecPaths("--sourcepath", sourcePathEntries);
@@ -406,7 +430,7 @@
     return this;
   }
 
-  public JavaCompileActionBuilder setOutputDepsProto(Artifact outputDepsProto) {
+  public JavaCompileActionBuilder setOutputDepsProto(PathFragment outputDepsProto) {
     this.outputDepsProto = outputDepsProto;
     return this;
   }
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 2f4e617..cc30c41 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
@@ -157,6 +157,7 @@
   private final ImportDepsCheckingLevel importDepsCheckingLevel;
   private final boolean allowRuntimeDepsOnNeverLink;
   private final JavaClasspathMode javaClasspath;
+  private final boolean inmemoryJdepsFiles;
   private final ImmutableList<String> defaultJvmFlags;
   private final ImmutableList<String> checkedConstraints;
   private final StrictDepsMode strictJavaDeps;
@@ -190,6 +191,7 @@
     this.generateJavaDeps =
         javaOptions.javaDeps || javaOptions.javaClasspath != JavaClasspathMode.OFF;
     this.javaClasspath = javaOptions.javaClasspath;
+    this.inmemoryJdepsFiles = javaOptions.inmemoryJdepsFiles;
     this.defaultJvmFlags = ImmutableList.copyOf(javaOptions.jvmOpts);
     this.checkedConstraints = ImmutableList.copyOf(javaOptions.checkedConstraints);
     this.strictJavaDeps = javaOptions.strictJavaDeps;
@@ -285,6 +287,10 @@
     return javaClasspath;
   }
 
+  public boolean inmemoryJdepsFiles() {
+    return inmemoryJdepsFiles;
+  }
+
   public ImmutableList<String> getDefaultJvmFlags() {
     return defaultJvmFlags;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index 5464f3d..4856451 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -116,17 +116,11 @@
       helper.createGenJarAction(classJar, manifestProtoOutput, genClassJar);
     }
 
-    Artifact outputDepsProto = helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder);
-
     Artifact nativeHeaderOutput = helper.createNativeHeaderJar(classJar);
 
-    helper.createCompileActionWithInstrumentation(
-        classJar,
-        manifestProtoOutput,
-        genSourceJar,
-        outputDepsProto,
-        javaArtifactsBuilder,
-        nativeHeaderOutput);
+    JavaCompileAction javaCompileAction =
+        helper.createCompileActionWithInstrumentation(
+            classJar, manifestProtoOutput, genSourceJar, javaArtifactsBuilder, nativeHeaderOutput);
     helper.createSourceJarAction(srcJar, genSourceJar);
 
     Artifact iJar = null;
@@ -136,7 +130,7 @@
     JavaRuleOutputJarsProvider.Builder ruleOutputJarsProviderBuilder =
         JavaRuleOutputJarsProvider.builder()
             .addOutputJar(classJar, iJar, manifestProtoOutput, ImmutableList.of(srcJar))
-            .setJdeps(outputDepsProto)
+            .setJdeps(javaCompileAction.getOutputDepsProto())
             .setNativeHeaders(nativeHeaderOutput);
 
     GeneratedExtensionRegistryProvider generatedExtensionRegistryProvider = null;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
index ce4fca5..e365743 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
@@ -235,8 +235,6 @@
             javaToolchainProvider,
             hostJavabase,
             jacocoInstrumental);
-    Artifact outputDepsProto = helper.createOutputDepsProtoArtifact(output, artifactsBuilder);
-
     Artifact manifestProtoOutput = helper.createManifestProtoOutput(output);
 
     Artifact genSourceJar = null;
@@ -249,13 +247,13 @@
 
     Artifact nativeHeaderOutput = helper.createNativeHeaderJar(output);
 
-    helper.createCompileAction(
-        output,
-        manifestProtoOutput,
-        genSourceJar,
-        outputDepsProto,
-        /* instrumentationMetadataJar= */ null,
-        nativeHeaderOutput);
+    JavaCompileAction javaCompileAction =
+        helper.createCompileAction(
+            output,
+            manifestProtoOutput,
+            genSourceJar,
+            /* instrumentationMetadataJar= */ null,
+            nativeHeaderOutput);
 
     Artifact iJar = null;
     if (!sourceJars.isEmpty() || !sourceFiles.isEmpty()) {
@@ -271,7 +269,7 @@
         outputSourceJar == null ? ImmutableList.of() : ImmutableList.of(outputSourceJar);
     outputJarsBuilder
         .addOutputJar(new OutputJar(output, iJar, manifestProtoOutput, outputSourceJars))
-        .setJdeps(outputDepsProto)
+        .setJdeps(javaCompileAction.getOutputDepsProto())
         .setNativeHeaders(nativeHeaderOutput);
 
     JavaCompilationArtifacts javaArtifacts = artifactsBuilder.build();
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 70e0c06..a50f2f4 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
@@ -226,6 +226,22 @@
   public JavaClasspathMode javaClasspath;
 
   @Option(
+      name = "experimental_inmemory_jdeps_files",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.BUILD_TIME_OPTIMIZATION,
+      effectTags = {
+        OptionEffectTag.LOADING_AND_ANALYSIS,
+        OptionEffectTag.EXECUTION,
+        OptionEffectTag.AFFECTS_OUTPUTS
+      },
+      metadataTags = {OptionMetadataTag.EXPERIMENTAL},
+      help =
+          "If enabled, the dependency (.jdeps) files generated from Java compilations will be "
+              + "passed through in memory directly from the remote build nodes instead of being "
+              + "written to disk.")
+  public boolean inmemoryJdepsFiles;
+
+  @Option(
       name = "java_debug",
       defaultValue = "null",
       expansion = {
@@ -679,6 +695,7 @@
 
     host.javaDeps = javaDeps;
     host.javaClasspath = javaClasspath;
+    host.inmemoryJdepsFiles = inmemoryJdepsFiles;
 
     host.strictJavaDeps = strictJavaDeps;
     host.fixDepsTool = fixDepsTool;