diff --git a/tools/archive.py b/tools/archive.py
index 20d057c..d929768 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -65,10 +65,11 @@
 def Main():
   if not 'BUILDBOT_BUILDERNAME' in os.environ:
     raise Exception('You are not a bot, don\'t archive builds')
+
+  create_maven_release.main(["--out", utils.LIBS])
+
   # Ensure all archived artifacts has been built before archiving.
   gradle.RunGradle([utils.D8, utils.R8, utils.COMPATDX, utils.COMPATPROGUARD])
-  create_maven_release.main(['--jar', utils.R8_JAR, "--out", utils.LIBS])
-
   version = GetVersion()
   is_master = IsMaster(version)
   if is_master:
diff --git a/tools/create_maven_release.py b/tools/create_maven_release.py
index 85b558a..cc045a2 100755
--- a/tools/create_maven_release.py
+++ b/tools/create_maven_release.py
@@ -3,8 +3,9 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-import hashlib
 import argparse
+import gradle
+import hashlib
 from os import makedirs
 from os.path import join
 from shutil import copyfile, make_archive, rmtree
@@ -14,13 +15,13 @@
 import tempfile
 import utils
 
-LICENSETEMPLATE = Template(
+DEPENDENCYTEMPLATE = Template(
 """
-    <license>
-      <name>$name</name>
-      <url>$url</url>
-      <distribution>repo</distribution>
-    </license>""")
+    <dependency>
+        <groupId>$group</groupId>
+        <artifactId>$artifact</artifactId>
+        <version>$version</version>
+    </dependency>""")
 
 POMTEMPLATE = Template(
 """<project
@@ -42,8 +43,10 @@
       <name>BSD-3-Clause</name>
       <url>https://opensource.org/licenses/BSD-3-Clause</url>
       <distribution>repo</distribution>
-    </license>$library_licenses
+    </license>
   </licenses>
+  <dependencies>$dependencies
+  </dependencies>
   <developers>
     <developer>
       <name>The Android Open Source Project</name>
@@ -62,19 +65,19 @@
 
 def parse_options(argv):
   result = argparse.ArgumentParser()
-  result.add_argument('--jar', help='jar file to package')
   result.add_argument('--out', help='directory in which to put the output zip file')
   return result.parse_args(argv)
 
-def determine_version(jar):
-  cmd = []
-  cmd.append('java')
-  cmd.extend(['-jar', jar]);
-  cmd.append('--version')
-  output = subprocess.check_output(cmd)
-  version_string = output.split()[1]
-  assert version_string.startswith("v")
-  return version_string[1:]
+def determine_version():
+  version_file = join(
+      utils.SRC_ROOT, 'com', 'android', 'tools', 'r8', 'Version.java')
+  with open(version_file, 'r') as file:
+    for line in file:
+      if 'final String LABEL ' in line:
+        result = line[line.find('"v') + 2:]
+        result = result[:result.find('"')]
+        return result
+  raise Exception('Unable to determine version.')
 
 def generate_library_licenses():
   license_prefix = 'license: '
@@ -103,9 +106,76 @@
     result += LICENSETEMPLATE.substitute(name=name, url=url)
   return result
 
+
+# Generate the dependencies block for the pom file.
+#
+# We ask gradle to list all dependencies. In that output
+# we locate the runtimeClasspath block for 'main' which
+# looks something like:
+#
+# runtimeClasspath - Runtime classpath of source set 'main'.
+# +--- net.sf.jopt-simple:jopt-simple:4.6
+# +--- com.googlecode.json-simple:json-simple:1.1
+# +--- com.google.guava:guava:23.0
+# +--- it.unimi.dsi:fastutil:7.2.0
+# +--- org.ow2.asm:asm:6.0
+# +--- org.ow2.asm:asm-commons:6.0
+# |    \--- org.ow2.asm:asm-tree:6.0
+# |         \--- org.ow2.asm:asm:6.0
+# +--- org.ow2.asm:asm-tree:6.0 (*)
+# +--- org.ow2.asm:asm-analysis:6.0
+# |    \--- org.ow2.asm:asm-tree:6.0 (*)
+# \--- org.ow2.asm:asm-util:6.0
+#      \--- org.ow2.asm:asm-tree:6.0 (*)
+#
+# We filter out the repeats that are marked by '(*)'.
+#
+# For each remaining line, we remove the junk at the start
+# in chunks. As an example:
+#
+# '  |    \--- org.ow2.asm:asm-tree:6.0  '  --strip-->
+# '|    \--- org.ow2.asm:asm-tree:6.0'  -->
+# '\--- org.ow2.asm:asm-tree:6.0'  -->
+# 'org.ow2.asm:asm-tree:6.0'
+#
+# The end result is the dependency we are looking for:
+#
+# groupId: org.ow2.asm
+# artifact: asm-tree
+# version: 6.0
+def generate_dependencies():
+  dependencies = gradle.RunGradleGetOutput(['dependencies'])
+  dependency_lines = []
+  collect = False
+  for line in dependencies.splitlines():
+    if 'runtimeClasspath' in line and "'main'" in line:
+      collect = True
+      continue
+    if collect:
+      if not len(line) == 0:
+        if not '(*)' in line:
+          trimmed = line.strip()
+          while trimmed.find(' ') != -1:
+            trimmed = trimmed[trimmed.find(' ') + 1:].strip()
+          if not trimmed in dependency_lines:
+            dependency_lines.append(trimmed)
+      else:
+        break
+  result = ''
+  for dep in dependency_lines:
+    components = dep.split(':')
+    assert len(components) == 3
+    group = components[0]
+    artifact = components[1]
+    version = components[2]
+    result += DEPENDENCYTEMPLATE.substitute(
+        group=group, artifact=artifact, version=version)
+  return result
+
 def write_pom_file(version, pom_file):
-  library_licenses = generate_library_licenses()
-  version_pom = POMTEMPLATE.substitute(version=version, library_licenses=library_licenses)
+  dependencies = generate_dependencies()
+  version_pom = POMTEMPLATE.substitute(
+      version=version, dependencies=dependencies)
   with open(pom_file, 'w') as file:
     file.write(version_pom)
 
@@ -131,13 +201,14 @@
 
 def main(argv):
   options = parse_options(argv)
-  jar = options.jar
   outdir = options.out
-  if jar == None or outdir == None:
-    print 'Need to supply --jar and --out.'
+  if outdir == None:
+    print 'Need to supply output dir with --out.'
     exit(1)
+  # Build the R8 no deps artifact.
+  gradle.RunGradleExcludeDeps([utils.R8])
   # Create directory structure for this version.
-  version = determine_version(jar)
+  version = determine_version()
   with utils.TempDir() as tmp_dir:
     version_dir = join(
         tmp_dir, 'com', 'google', 'android', 'tools', 'r8', version, 'r8')
@@ -147,7 +218,7 @@
     write_pom_file(version, pom_file)
     # Copy the jar to the output.
     target_jar = join(version_dir, 'r8-' + version + '.jar')
-    copyfile(jar, target_jar)
+    copyfile(utils.R8_JAR, target_jar)
     # Create check sums.
     write_md5_for(target_jar)
     write_md5_for(pom_file)
diff --git a/tools/gradle.py b/tools/gradle.py
index 275c270..df80cc9 100755
--- a/tools/gradle.py
+++ b/tools/gradle.py
@@ -54,9 +54,12 @@
   else:
     print 'gradle.py: Shadow library present'
 
-def RunGradle(args, throw_on_failure=True):
+def EnsureDeps():
   EnsureGradle()
   EnsureShadow()
+
+def RunGradle(args, throw_on_failure=True):
+  EnsureDeps()
   cmd = [GRADLE]
   cmd.extend(args)
   utils.PrintCmd(cmd)
@@ -66,6 +69,19 @@
       raise
     return return_value
 
+def RunGradleExcludeDeps(args, throw_on_failure=True):
+  EnsureDeps()
+  args.append('-Pexclude_deps')
+  RunGradle(args, throw_on_failure)
+
+def RunGradleGetOutput(args):
+  EnsureDeps()
+  cmd = [GRADLE]
+  cmd.extend(args)
+  utils.PrintCmd(cmd)
+  with utils.ChangedWorkingDirectory(utils.REPO_ROOT):
+    return subprocess.check_output(cmd)
+
 def Main():
   RunGradle(sys.argv[1:])
 
diff --git a/tools/utils.py b/tools/utils.py
index 40a62b8..ec78304 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -20,6 +20,7 @@
 DEX_SEGMENTS_RESULT_PATTERN = re.compile('- ([^:]+): ([0-9]+)')
 LIBS = os.path.join(REPO_ROOT, 'build', 'libs')
 MAVEN_ZIP = os.path.join(LIBS, 'r8.zip')
+SRC_ROOT = os.path.join(REPO_ROOT, 'src', 'main', 'java')
 
 D8 = 'd8'
 R8 = 'r8'
