Extend test infrastructure to test JDK 17

Change-Id: I6c15a21ef2ac8ccff65ff82738c02adc38479672
diff --git a/build.gradle b/build.gradle
index 5b9c8df..a138d84 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,9 +2,10 @@
 // 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 desugaredlibrary.CustomConversionAsmRewriterTask
 import dx.DexMergerTask
 import dx.DxTask
-import desugaredlibrary.CustomConversionAsmRewriterTask
 import net.ltgt.gradle.errorprone.CheckSeverity
 import org.gradle.internal.os.OperatingSystem
 import smali.SmaliTask
@@ -79,6 +80,14 @@
             srcDirs "third_party/api_database/api_database"
         }
     }
+    main17 {
+        java {
+            srcDirs = ['src/main/java']
+        }
+        resources {
+            srcDirs "third_party/api_database/api_database"
+        }
+    }
     test {
         java {
             srcDirs = [
@@ -252,6 +261,25 @@
     main11Implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
     main11Implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
 
+    main17Implementation "net.sf.jopt-simple:jopt-simple:$joptSimpleVersion"
+    main17Implementation "com.google.code.gson:gson:$gsonVersion"
+    // Include all of guava when compiling the code, but exclude annotations that we don't
+    // need from the packaging.
+    main17CompileOnly("com.google.guava:guava:$guavaVersion")
+    main17Implementation("com.google.guava:guava:$guavaVersion", {
+        exclude group: 'com.google.errorprone'
+        exclude group: 'com.google.code.findbugs'
+        exclude group: 'com.google.j2objc'
+        exclude group: 'org.codehaus.mojo'
+    })
+    main17Implementation group: 'it.unimi.dsi', name: 'fastutil', version: fastutilVersion
+    main17Implementation "org.jetbrains.kotlinx:kotlinx-metadata-jvm:$kotlinExtMetadataJVMVersion"
+    main17Implementation group: 'org.ow2.asm', name: 'asm', version: asmVersion
+    main17Implementation group: 'org.ow2.asm', name: 'asm-commons', version: asmVersion
+    main17Implementation group: 'org.ow2.asm', name: 'asm-tree', version: asmVersion
+    main17Implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
+    main17Implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
+    
     examplesTestNGRunnerCompile group: 'org.testng', name: 'testng', version: testngVersion
 
     testCompile sourceSets.examples.output
@@ -630,6 +658,11 @@
         JavaVersion.VERSION_11,
         false)
 setJdkCompilationWithCompatibility(
+        sourceSets.main17.compileJavaTaskName,
+        'jdk-17',
+        JavaVersion.VERSION_17,
+        false)
+setJdkCompilationWithCompatibility(
         sourceSets.examplesJava11.compileJavaTaskName,
         'jdk-11',
         JavaVersion.VERSION_11,
@@ -782,6 +815,11 @@
     archiveFileName = 'sources_main_11.jar'
 }
 
+task repackageSources17(type: Jar) {
+    from sourceSets.main17.output
+    archiveFileName = 'sources_main_17.jar'
+}
+
 def r8CreateTask(name, baseName, sources, includeLibraryLicenses, includeSwissArmyKnife) {
     return tasks.create("r8Create${name}", Jar) {
         entryCompression ZipEntryCompression.STORED
@@ -872,6 +910,20 @@
     outputs.files r8Task.outputs.files
 }
 
+task r8WithDeps17 {
+    dependsOn repackageSources17
+    dependsOn repackageDeps
+    inputs.files ([repackageSources17.outputs, repackageDeps.outputs])
+    def r8Task = r8CreateTask(
+            'WithDeps17',
+            'r8_with_deps_17.jar',
+            repackageSources17.outputs.files + repackageDeps.outputs.files,
+            true,
+            true)
+    dependsOn r8Task
+    outputs.files r8Task.outputs.files
+}
+
 task r8WithRelocatedDeps {
     def output = "${buildDir}/libs/r8_with_relocated_deps.jar"
     dependsOn r8RelocateTask(r8WithDeps, output)
@@ -886,6 +938,13 @@
     outputs.file output
 }
 
+task r8WithRelocatedDeps17 {
+    def output = "${buildDir}/libs/r8_with_relocated_deps_17.jar"
+    dependsOn r8RelocateTask(r8WithDeps17, output)
+    inputs.files r8WithDeps17.outputs.files
+    outputs.file output
+}
+
 task r8WithoutDeps {
     dependsOn repackageSources
     inputs.files repackageSources.outputs