Add a `--hermetic_java_home=` flag to singlejar

PiperOrigin-RevId: 445519501
diff --git a/src/tools/singlejar/options.cc b/src/tools/singlejar/options.cc
index 692e306..0c81f58 100644
--- a/src/tools/singlejar/options.cc
+++ b/src/tools/singlejar/options.cc
@@ -55,7 +55,8 @@
                           &warn_duplicate_resources) ||
       tokens->MatchAndSet("--nocompress_suffixes", &nocompress_suffixes) ||
       tokens->MatchAndSet("--check_desugar_deps", &check_desugar_deps) ||
-      tokens->MatchAndSet("--multi_release", &multi_release)) {
+      tokens->MatchAndSet("--multi_release", &multi_release) ||
+      tokens->MatchAndSet("--hermetic_java_home", &hermetic_java_home)) {
     return true;
   } else if (tokens->MatchAndSet("--build_info_file", &optarg)) {
     build_info_files.push_back(optarg);
diff --git a/src/tools/singlejar/options.h b/src/tools/singlejar/options.h
index 23b96c9..149f999 100644
--- a/src/tools/singlejar/options.h
+++ b/src/tools/singlejar/options.h
@@ -65,6 +65,7 @@
   bool warn_duplicate_resources;
   bool check_desugar_deps;
   bool multi_release;
+  std::string hermetic_java_home;
 
  protected:
   /*
diff --git a/src/tools/singlejar/options_test.cc b/src/tools/singlejar/options_test.cc
index 2d2b831..b795d44 100644
--- a/src/tools/singlejar/options_test.cc
+++ b/src/tools/singlejar/options_test.cc
@@ -20,11 +20,10 @@
 #include "googletest/include/gtest/gtest.h"
 
 TEST(OptionsTest, Flags1) {
-  const char *args[] = {"--exclude_build_data",
-                        "--compression",
-                        "--normalize",
-                        "--no_duplicates",
-                        "--output", "output_jar"};
+  const char *args[] = {
+      "--exclude_build_data", "--compression",     "--normalize",
+      "--no_duplicates",      "--output",          "output_jar",
+      "--hermetic_java_home", "hermetic_java_home"};
   Options options;
   options.ParseCommandLine(arraysize(args), args);
 
@@ -38,6 +37,7 @@
   EXPECT_FALSE(options.check_desugar_deps);
   EXPECT_FALSE(options.multi_release);
   EXPECT_EQ("output_jar", options.output_jar);
+  EXPECT_EQ("hermetic_java_home", options.hermetic_java_home);
 }
 
 TEST(OptionsTest, Flags2) {
@@ -60,6 +60,7 @@
   ASSERT_TRUE(options.warn_duplicate_resources);
   ASSERT_TRUE(options.check_desugar_deps);
   ASSERT_TRUE(options.multi_release);
+  EXPECT_EQ("", options.hermetic_java_home);
 }
 
 TEST(OptionsTest, SingleOptargs) {
diff --git a/src/tools/singlejar/output_jar.cc b/src/tools/singlejar/output_jar.cc
index f47e8bd..923ed10 100644
--- a/src/tools/singlejar/output_jar.cc
+++ b/src/tools/singlejar/output_jar.cc
@@ -145,6 +145,9 @@
   if (options_->multi_release) {
     manifest_.EnableMultiRelease();
   }
+  if (!options_->hermetic_java_home.empty()) {
+    manifest_.AppendLine("Hermetic-Java-Home: " + options_->hermetic_java_home);
+  }
   for (auto &manifest_line : options_->manifest_lines) {
     if (!manifest_line.empty()) {
       manifest_.AppendLine(manifest_line);
diff --git a/src/tools/singlejar/output_jar_simple_test.cc b/src/tools/singlejar/output_jar_simple_test.cc
index ee9d11b..f96b5c7 100644
--- a/src/tools/singlejar/output_jar_simple_test.cc
+++ b/src/tools/singlejar/output_jar_simple_test.cc
@@ -989,4 +989,17 @@
       manifest);
 }
 
+// --hermetic_java_home
+TEST_F(OutputJarSimpleTest, HermeticJavaHome) {
+  string out_path = OutputFilePath("out.jar");
+  CreateOutput(out_path, {"--hermetic_java_home", "foo/bar/java_home"});
+  string manifest = GetEntryContents(out_path, "META-INF/MANIFEST.MF");
+  EXPECT_EQ(
+      "Manifest-Version: 1.0\r\n"
+      "Created-By: singlejar\r\n"
+      "Hermetic-Java-Home: foo/bar/java_home\r\n"
+      "\r\n",
+      manifest);
+}
+
 }  // namespace