diff --git a/tools/archive.py b/tools/archive.py
index a3f906f..893fc19 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -127,55 +127,7 @@
   if not utils.IsWindows():
     PrintResourceInfo()
 
-  # Create maven release which uses a build that exclude dependencies.
-  create_maven_release.generate_r8_maven_zip(utils.MAVEN_ZIP)
-  create_maven_release.generate_r8_maven_zip(
-      utils.MAVEN_ZIP_LIB, is_r8lib=True)
-
-  # Generate and copy a full build without dependencies.
-  gradle.RunGradleExcludeDeps([utils.R8, utils.R8_SRC])
-  shutil.copyfile(utils.R8_JAR, utils.R8_FULL_EXCLUDE_DEPS_JAR)
-
-  # Ensure all archived artifacts has been built before archiving.
-  # The target tasks postfixed by 'lib' depend on the actual target task so
-  # building it invokes the original task first.
-  # The '-Pno_internal' flag is important because we generate the lib based on uses in tests.
-  gradle.RunGradle([
-    utils.R8,
-    utils.D8,
-    utils.R8LIB,
-    utils.R8LIB_NO_DEPS,
-    utils.R8RETRACE,
-    utils.R8RETRACE_NO_DEPS,
-    utils.LIBRARY_DESUGAR_CONVERSIONS,
-    '-Pno_internal'
-  ])
-
-  # Create maven release of the desuage_jdk_libs configuration. This require
-  # an r8.jar with dependencies to have been built.
-  create_maven_release.generate_desugar_configuration_maven_zip(
-      utils.DESUGAR_CONFIGURATION_MAVEN_ZIP,
-      utils.DESUGAR_CONFIGURATION,
-      utils.DESUGAR_IMPLEMENTATION)
-  create_maven_release.generate_desugar_configuration_maven_zip(
-      utils.DESUGAR_CONFIGURATION_LEGACY_JDK11_MAVEN_ZIP,
-      utils.DESUGAR_CONFIGURATION_JDK11_LEGACY,
-      utils.DESUGAR_IMPLEMENTATION_JDK11)
-
-  version = GetVersion()
-  is_main = IsMain(version)
-  if is_main:
-    # On main we use the git hash to archive with
-    print('On main, using git hash for archiving')
-    version = GetGitHash()
-
-  destination = GetVersionDestination('gs://', version, is_main)
-  if utils.cloud_storage_exists(destination) and not options.dry_run:
-    raise Exception('Target archive directory %s already exists' % destination)
   with utils.TempDir() as temp:
-    # Create pom file for our maven repository that we build for testing.
-    default_pom_file = os.path.join(temp, 'r8.pom')
-    create_maven_release.write_default_r8_pom_file(default_pom_file, version)
 
     version_file = os.path.join(temp, 'r8-version.properties')
     with open(version_file,'w') as version_writer:
@@ -190,6 +142,56 @@
       version_writer.write(releaser)
       version_writer.write('version-file.version.code=1\n')
 
+    # Create maven release which uses a build that exclude dependencies.
+    create_maven_release.generate_r8_maven_zip(utils.MAVEN_ZIP, version_file=version_file)
+    create_maven_release.generate_r8_maven_zip(
+        utils.MAVEN_ZIP_LIB, is_r8lib=True, version_file=version_file)
+
+    # Generate and copy a full build without dependencies.
+    gradle.RunGradleExcludeDeps([utils.R8, utils.R8_SRC])
+    shutil.copyfile(utils.R8_JAR, utils.R8_FULL_EXCLUDE_DEPS_JAR)
+
+    # Ensure all archived artifacts has been built before archiving.
+    # The target tasks postfixed by 'lib' depend on the actual target task so
+    # building it invokes the original task first.
+    # The '-Pno_internal' flag is important because we generate the lib based on uses in tests.
+    gradle.RunGradle([
+        utils.R8,
+        utils.D8,
+        utils.R8LIB,
+        utils.R8LIB_NO_DEPS,
+        utils.R8RETRACE,
+        utils.R8RETRACE_NO_DEPS,
+        utils.LIBRARY_DESUGAR_CONVERSIONS,
+        '-Pno_internal'
+    ])
+
+    # Create maven release of the desuage_jdk_libs configuration. This require
+    # an r8.jar with dependencies to have been built.
+    create_maven_release.generate_desugar_configuration_maven_zip(
+        utils.DESUGAR_CONFIGURATION_MAVEN_ZIP,
+        utils.DESUGAR_CONFIGURATION,
+        utils.DESUGAR_IMPLEMENTATION)
+    create_maven_release.generate_desugar_configuration_maven_zip(
+        utils.DESUGAR_CONFIGURATION_LEGACY_JDK11_MAVEN_ZIP,
+        utils.DESUGAR_CONFIGURATION_JDK11_LEGACY,
+        utils.DESUGAR_IMPLEMENTATION_JDK11)
+
+    version = GetVersion()
+    is_main = IsMain(version)
+    if is_main:
+      # On main we use the git hash to archive with
+      print('On main, using git hash for archiving')
+      version = GetGitHash()
+
+    destination = GetVersionDestination('gs://', version, is_main)
+    if utils.cloud_storage_exists(destination) and not options.dry_run:
+      raise Exception('Target archive directory %s already exists' % destination)
+
+    # Create pom file for our maven repository that we build for testing.
+    default_pom_file = os.path.join(temp, 'r8.pom')
+    create_maven_release.write_default_r8_pom_file(default_pom_file, version)
+
     for file in [
       utils.D8_JAR,
       utils.R8_JAR,
diff --git a/tools/create_maven_release.py b/tools/create_maven_release.py
index 10bbea4..6250c75 100755
--- a/tools/create_maven_release.py
+++ b/tools/create_maven_release.py
@@ -9,7 +9,7 @@
 import jdk
 import json
 from os import makedirs
-from os.path import join
+from os.path import join, basename
 from shutil import copyfile, make_archive, move, rmtree
 import subprocess
 import sys
@@ -309,7 +309,7 @@
     base_no_zip = out[0:len(out)-4]
     make_archive(base_no_zip, 'zip', tmp_dir)
 
-def generate_r8_maven_zip(out, is_r8lib=False):
+def generate_r8_maven_zip(out, is_r8lib=False, version_file=None):
   # Build the R8 no deps artifact.
   if not is_r8lib:
     gradle.RunGradleExcludeDeps([utils.R8])
@@ -318,6 +318,13 @@
 
   version = determine_version()
   with utils.TempDir() as tmp_dir:
+    file_copy = join(tmp_dir, 'copy_of_jar.jar')
+    copyfile(utils.R8LIB_JAR if is_r8lib else utils.R8_JAR, file_copy)
+
+    if version_file:
+      with zipfile.ZipFile(file_copy, 'a') as zip:
+        zip.write(version_file, basename(version_file))
+
     # Generate the pom file.
     pom_file = join(tmp_dir, 'r8.pom')
     write_pom_file(
@@ -331,7 +338,7 @@
         'r8',
         version,
         pom_file,
-        utils.R8LIB_JAR if is_r8lib else utils.R8_JAR,
+        file_copy,
         out)
 
 # Write the desugaring configuration of a jar file with the following content:
