Make keepanno a non-composite project.

Change-Id: I177a70ed9ee8dc2e63563312376dc2759e252ba7
diff --git a/d8_r8/assistant/build.gradle.kts b/d8_r8/assistant/build.gradle.kts
index 47d3521..b21645f 100644
--- a/d8_r8/assistant/build.gradle.kts
+++ b/d8_r8/assistant/build.gradle.kts
@@ -7,7 +7,7 @@
   id("dependencies-plugin")
 }
 
-dependencies { compileOnly(":keepanno") }
+dependencies { compileOnly(project(":keepanno", "keepannoClasses")) }
 
 java {
   sourceSets.main.configure { java.srcDir(getRoot().resolveAll("src", "assistant", "java")) }
diff --git a/d8_r8/blastradius/build.gradle.kts b/d8_r8/blastradius/build.gradle.kts
index 0a5b935..8935bed 100644
--- a/d8_r8/blastradius/build.gradle.kts
+++ b/d8_r8/blastradius/build.gradle.kts
@@ -47,7 +47,7 @@
 }
 
 dependencies {
-  compileOnly(":keepanno")
+  compileOnly(project(":keepanno", "keepannoClasses"))
   compileOnly(Deps.protobuf)
   errorprone(Deps.errorprone)
 }
diff --git a/d8_r8/dist/build.gradle.kts b/d8_r8/dist/build.gradle.kts
index 8ae0a5c..5023543 100644
--- a/d8_r8/dist/build.gradle.kts
+++ b/d8_r8/dist/build.gradle.kts
@@ -92,9 +92,17 @@
 val blastRadiusProtoJarScope by configurations.dependencyScope("blastRadiusProtoJarScope")
 val blastRadiusProtoJarConfig by
   configurations.resolvable("blastRadiusProtoJarConfig") { extendsFrom(blastRadiusProtoJarScope) }
-val keepAnnoJarTask = projectTask("keepanno", "jar")
-val keepAnnoDepsJarExceptAsm = projectTask("keepanno", "depsJarExceptAsm")
-val keepAnnoToolsJarTask = projectTask("keepanno", "toolsJar")
+val keepAnnoJarScope by configurations.dependencyScope("keepAnnoJarScope")
+val keepAnnoJarConfig by
+  configurations.resolvable("keepAnnoJarConfig") { extendsFrom(keepAnnoJarScope) }
+val keepAnnoDepsJarExceptAsmScope by configurations.dependencyScope("keepAnnoDepsJarExceptAsmScope")
+val keepAnnoDepsJarExceptAsmConfig by
+  configurations.resolvable("keepAnnoDepsJarExceptAsmConfig") {
+    extendsFrom(keepAnnoDepsJarExceptAsmScope)
+  }
+val keepAnnoToolsJarScope by configurations.dependencyScope("keepAnnoToolsJarScope")
+val keepAnnoToolsJarConfig by
+  configurations.resolvable("keepAnnoToolsJarConfig") { extendsFrom(keepAnnoToolsJarScope) }
 
 val libanalyzerJarScope by configurations.dependencyScope("libanalyzerJarScope")
 val libanalyzerJarConfig by
@@ -113,6 +121,9 @@
   assistantJarScope(project(":assistant", "assistantJar"))
   blastRadiusWithoutProtoJarScope(project(":blastradius", "blastradiusWithoutProtoJar"))
   blastRadiusProtoJarScope(project(":blastradius", "blastradiusProtoJar"))
+  keepAnnoJarScope(project(":keepanno", "keepannoJar"))
+  keepAnnoDepsJarExceptAsmScope(project(":keepanno", "keepannoDepsJarExceptAsm"))
+  keepAnnoToolsJarScope(project(":keepanno", "keepannoToolsJar"))
   libanalyzerJarScope(project(":libanalyzer", "libanalyzer-jar"))
   libanalyzerProtoJarScope(project(":libanalyzer", "libanalyzer-proto-jar"))
   mainJarScope(project(":main", "mainJar"))
@@ -313,7 +324,7 @@
     objects.fileCollection().apply {
       from(assistantJarConfig)
       from(blastRadiusWithoutProtoJarConfig)
-      from(keepAnnoJarTask)
+      from(keepAnnoJarConfig)
       from(libanalyzerJarConfig)
       from(mainJarConfig)
       from(resourceShrinkerJarTask)
@@ -457,23 +468,28 @@
 
   val keepAnnoToolsWithRelocatedDeps by
     registering(Exec::class) {
-      dependsOn(depsJar, keepAnnoDepsJarExceptAsm, keepAnnoToolsJarTask, swissArmyKnifeJarFiles)
+      dependsOn(
+        depsJar,
+        keepAnnoDepsJarExceptAsmConfig,
+        keepAnnoToolsJarConfig,
+        swissArmyKnifeJarFiles,
+      )
       val output = getRoot().resolveAll("build", "libs", "keepanno-tools.jar")
       outputs.file(output)
       inputs.files(
         Callable {
           listOf(
             depsJar.get().getSingleOutputFile(),
-            keepAnnoDepsJarExceptAsm.getSingleOutputFile(),
-            keepAnnoToolsJarTask.getSingleOutputFile(),
+            keepAnnoDepsJarExceptAsmConfig.singleFile,
+            keepAnnoToolsJarConfig.singleFile,
             swissArmyKnifeJarFiles,
           )
         }
       )
       doFirst {
         val deps = depsJar.get().getSingleOutputFile()
-        val keepAnnoDeps = keepAnnoDepsJarExceptAsm.getSingleOutputFile()
-        val keepAnnoTools = keepAnnoToolsJarTask.getSingleOutputFile()
+        val keepAnnoDeps = keepAnnoDepsJarExceptAsmConfig.singleFile
+        val keepAnnoTools = keepAnnoToolsJarConfig.singleFile
         val pkg = "com.android.tools.r8.keepanno"
         commandLine =
           baseCompilerCommandLine(
diff --git a/d8_r8/keepanno/build.gradle.kts b/d8_r8/keepanno/build.gradle.kts
index 81af0cb..c54a693 100644
--- a/d8_r8/keepanno/build.gradle.kts
+++ b/d8_r8/keepanno/build.gradle.kts
@@ -90,11 +90,7 @@
       archiveFileName.set("keepanno-annotations-androidx.jar")
     }
 
-  val keepAnnoJar by
-    registering(Jar::class) {
-      dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
-      from(sourceSets.main.get().output)
-    }
+  named<Jar>("jar") { dependsOn(gradle.includedBuild("shared").task(":downloadDeps")) }
 
   val keepAnnoAnnotationsDoc by
     registering(Javadoc::class) {
@@ -176,3 +172,37 @@
       archiveFileName.set("keepanno-tools.jar")
     }
 }
+
+val keepannoJar by
+  configurations.consumable("keepannoJar") { outgoing.artifact(tasks.named<Jar>("jar")) }
+
+val keepannoDepsJarExceptAsm by
+  configurations.consumable("keepannoDepsJarExceptAsm") {
+    outgoing.artifact(tasks.named<Jar>("depsJarExceptAsm"))
+  }
+
+val keepannoToolsJar by
+  configurations.consumable("keepannoToolsJar") { outgoing.artifact(tasks.named<Jar>("toolsJar")) }
+
+val keepannoAndroidXAnnotationsJar by
+  configurations.consumable("keepannoAndroidXAnnotationsJar") {
+    outgoing.artifact(tasks.named<Jar>("keepAnnoAndroidXAnnotationsJar"))
+  }
+
+val keepannoDepsJarOnlyAsm by
+  configurations.consumable("keepannoDepsJarOnlyAsm") {
+    outgoing.artifact(tasks.named<Jar>("depsJarOnlyAsm"))
+  }
+
+val keepannoSources by
+  configurations.consumable("keepannoSources") { outgoing.artifact(tasks.named<Jar>("sourcesJar")) }
+
+val keepannoClasses by
+  configurations.consumable("keepannoClasses") {
+    outgoing.artifact(tasks.named<JavaCompile>("compileJava").map { it.destinationDirectory })
+    outgoing.artifact(
+      tasks.named<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>("compileKotlin").map {
+        it.destinationDirectory
+      }
+    )
+  }
diff --git a/d8_r8/libanalyzer/build.gradle.kts b/d8_r8/libanalyzer/build.gradle.kts
index 11dbde5..ed51b17 100644
--- a/d8_r8/libanalyzer/build.gradle.kts
+++ b/d8_r8/libanalyzer/build.gradle.kts
@@ -60,7 +60,7 @@
 dependencies {
   compileOnly(Deps.guava)
   compileOnly(Deps.protobuf)
-  compileOnly(":keepanno")
+  compileOnly(project(":keepanno", "keepannoClasses"))
   compileOnly(project(":main", "mainClassesOutput"))
   compileOnly(project(":main", "turboClassesOutput"))
   errorprone(Deps.errorprone)
diff --git a/d8_r8/main/build.gradle.kts b/d8_r8/main/build.gradle.kts
index 87932b4..cf21a2a 100644
--- a/d8_r8/main/build.gradle.kts
+++ b/d8_r8/main/build.gradle.kts
@@ -201,8 +201,6 @@
   withSourcesJar()
 }
 
-val keepAnnoJarTask = projectTask("keepanno", "jar")
-val keepAnnoToolsJar = projectTask("keepanno", "toolsJar")
 val resourceShrinkerJarTask = projectTask("resourceshrinker", "jar")
 val downloadDepsTask = projectTask("shared", "downloadDeps")
 
@@ -229,7 +227,7 @@
   internalClassesScope(project(":utils", "isolatedClasses"))
   implementation(project(":assistant", "assistantJar"))
   implementation(project(":blastradius", "blastradiusJar"))
-  implementation(keepAnnoJarTask.outputs.files)
+  implementation(project(":keepanno", "keepannoClasses"))
   implementation(resourceShrinkerJarTask.outputs.files)
   implementation(project(":utils"))
   Deps.compilerDeps.forEach { compileOnly(it) }
diff --git a/d8_r8/test/build.gradle.kts b/d8_r8/test/build.gradle.kts
index 367a503..fb875f7 100644
--- a/d8_r8/test/build.gradle.kts
+++ b/d8_r8/test/build.gradle.kts
@@ -39,10 +39,31 @@
 val blastRadiusSourcesScope by configurations.dependencyScope("blastRadiusSourcesScope")
 val blastRadiusSourcesConfig by
   configurations.resolvable("blastRadiusSourcesConfig") { extendsFrom(blastRadiusSourcesScope) }
+val keepAnnoAndroidXAnnotationsJarScope by
+  configurations.dependencyScope("keepAnnoAndroidXAnnotationsJarScope")
+val keepAnnoAndroidXAnnotationsJarConfig by
+  configurations.resolvable("keepAnnoAndroidXAnnotationsJarConfig") {
+    extendsFrom(keepAnnoAndroidXAnnotationsJarScope)
+  }
+val keepAnnoDepsJarOnlyAsmScope by configurations.dependencyScope("keepAnnoDepsJarOnlyAsmScope")
+val keepAnnoDepsJarOnlyAsmConfig by
+  configurations.resolvable("keepAnnoDepsJarOnlyAsmConfig") {
+    extendsFrom(keepAnnoDepsJarOnlyAsmScope)
+  }
+val keepAnnoSourcesScope by configurations.dependencyScope("keepAnnoSourcesScope")
+val keepAnnoSourcesConfig by
+  configurations.resolvable("keepAnnoSourcesConfig") { extendsFrom(keepAnnoSourcesScope) }
+val keepAnnoClassesScope by configurations.dependencyScope("keepAnnoClassesScope")
+val keepAnnoClassesConfig by
+  configurations.resolvable("keepAnnoClassesConfig") { extendsFrom(keepAnnoClassesScope) }
 
 dependencies {
   assistantJarScope(project(":assistant", "assistantJar"))
   blastRadiusSourcesScope(project(":blastradius", "blastradiusSources"))
+  keepAnnoAndroidXAnnotationsJarScope(project(":keepanno", "keepannoAndroidXAnnotationsJar"))
+  keepAnnoDepsJarOnlyAsmScope(project(":keepanno", "keepannoDepsJarOnlyAsm"))
+  keepAnnoSourcesScope(project(":keepanno", "keepannoSources"))
+  keepAnnoClassesScope(project(":keepanno", "keepannoClasses"))
   testJarsScope(project(":tests_java_8", "testJar"))
   testJarsScope(project(":tests_java_9", "testJar"))
   testJarsScope(project(":tests_java_11", "testJar"))
@@ -56,10 +77,6 @@
   mainSourcesScope(project(":main", "mainSources"))
 }
 
-val keepAnnoCompileTask = projectTask("keepanno", "compileJava")
-val keepAnnoCompileKotlinTask = projectTask("keepanno", "compileKotlin")
-val keepAnnoSourcesTask = projectTask("keepanno", "sourcesJar")
-
 val libanalyzerSourcesScope by configurations.dependencyScope("libanalyzerSourcesScope")
 val libanalyzerSourcesConfig by
   configurations.resolvable("libanalyzerSourcesConfig") { extendsFrom(libanalyzerSourcesScope) }
@@ -73,10 +90,8 @@
   project(":dist").tasks.getByName("processKeepRulesLibWithRelocatedDeps")
 val r8WithRelocatedDepsTask = project(":dist").tasks.getByName("r8WithRelocatedDeps")
 val resourceShrinkerSourcesTask = projectTask("resourceshrinker", "sourcesJar")
-val keepAnnoAndroidXAnnotationsJar = projectTask("keepanno", "keepAnnoAndroidXAnnotationsJar")
 val keepAnnoToolsWithRelocatedDepsTask =
   project(":dist").tasks.getByName("keepAnnoToolsWithRelocatedDeps")
-val depsJarOnlyAsmTask = projectTask("keepanno", "depsJarOnlyAsm")
 
 tasks {
   withType<Exec> { doFirst { println("Executing command: ${commandLine.joinToString(" ")}") } }
@@ -102,9 +117,9 @@
 
   val packageTestDeps by
     registering(Jar::class) {
-      dependsOn(keepAnnoAndroidXAnnotationsJar)
+      dependsOn(keepAnnoAndroidXAnnotationsJarConfig)
       from(testDepsJars.elements.map { it.map { zipTree(it) } })
-      from(keepAnnoAndroidXAnnotationsJar.outputs.getFiles().map(::zipTree))
+      from(keepAnnoAndroidXAnnotationsJarConfig.map(::zipTree))
       exclude("META-INF/*.kotlin_module", "**/*.kotlin_metadata", "org/jspecify/**", "org/jspecify")
       duplicatesStrategy = DuplicatesStrategy.EXCLUDE
       destinationDirectory.set(getRoot().resolveAll("build", "libs"))
@@ -294,7 +309,7 @@
     registering(Exec::class) {
       dependsOn(r8WithRelocatedDepsTask)
       dependsOn(keepAnnoToolsWithRelocatedDepsTask)
-      dependsOn(depsJarOnlyAsmTask)
+      dependsOn(keepAnnoDepsJarOnlyAsmConfig)
       dependOnPythonScripts()
       val inputJar = keepAnnoToolsWithRelocatedDepsTask.getSingleOutputFile()
       val r8WithRelocatedDepsJar = r8WithRelocatedDepsTask.getSingleOutputFile()
@@ -310,7 +325,7 @@
           keepRuleFiles,
           excludingDepsVariant = false,
           debugVariant = false,
-          classpath = listOf(depsJarOnlyAsmTask.getSingleOutputFile()),
+          classpath = listOf(keepAnnoDepsJarOnlyAsmConfig.singleFile),
           versionJar = r8WithRelocatedDepsJar,
         )
     }
@@ -532,11 +547,7 @@
 
     systemProperty(
       "BUILD_PROP_KEEPANNO_RUNTIME_PATH",
-      extractClassesPaths(
-        "keepanno" + File.separator,
-        keepAnnoCompileTask.outputs.files.asPath,
-        keepAnnoCompileKotlinTask.outputs.files.asPath,
-      ),
+      extractClassesPaths("keepanno" + File.separator, keepAnnoClassesConfig.asPath),
     )
     systemProperty("BUILD_PROP_PROCESS_KEEP_RULES_RUNTIME_PATH", processKeepRulesLibJar)
     systemProperty("BUILD_PROP_R8_RUNTIME_PATH", r8LibJar)
@@ -562,12 +573,12 @@
   val packageSources by
     registering(Jar::class) {
       dependsOn(blastRadiusSourcesConfig)
-      dependsOn(keepAnnoSourcesTask)
+      dependsOn(keepAnnoSourcesConfig)
       dependsOn(libanalyzerSourcesConfig)
       dependsOn(resourceShrinkerSourcesTask)
       dependsOn(mainSourcesConfig)
       from(blastRadiusSourcesConfig.map(::zipTree))
-      from(keepAnnoSourcesTask.outputs.files.map(::zipTree))
+      from(keepAnnoSourcesConfig.map(::zipTree))
       from(libanalyzerSourcesConfig.map(::zipTree))
       from(mainSourcesConfig.map(::zipTree))
       from(resourceShrinkerSourcesTask.outputs.files.map(::zipTree))
diff --git a/d8_r8/test_modules/testbase/build.gradle.kts b/d8_r8/test_modules/testbase/build.gradle.kts
index ca9c7c3..9044d42 100644
--- a/d8_r8/test_modules/testbase/build.gradle.kts
+++ b/d8_r8/test_modules/testbase/build.gradle.kts
@@ -20,10 +20,9 @@
   toolchain { languageVersion = JavaLanguageVersion.of(JvmCompatibility.release) }
 }
 
-// If we depend on keepanno by referencing the project source outputs we get an error regarding
-// incompatible java class file version. By depending on the jar we circumvent that.
-val keepAnnoJarTask = projectTask("keepanno", "jar")
-val keepAnnoCompileJavaTask = projectTask("keepanno", "compileJava")
+val keepAnnoJarScope by configurations.dependencyScope("keepAnnoJarScope")
+val keepAnnoJarConfig by
+  configurations.resolvable("keepAnnoJarConfig") { extendsFrom(keepAnnoJarScope) }
 val resourceShrinkerCompileJavaTask = projectTask("resourceshrinker", "compileJava")
 val resourceShrinkerCompileKotlinTask = projectTask("resourceshrinker", "compileKotlin")
 val resourceShrinkerDepsJarTask = projectTask("resourceshrinker", "depsJar")
@@ -31,7 +30,8 @@
 val sharedDownloadTestDepsTask = projectTask("shared", "downloadTestDeps")
 
 dependencies {
-  implementation(keepAnnoJarTask.outputs.files)
+  keepAnnoJarScope(project(":keepanno", "keepannoJar"))
+  implementation(project(":keepanno", "keepannoJar"))
   implementation(project(":libanalyzer", "libanalyzer-compile-java"))
   implementation(project(":main", "mainClassesOutput"))
   implementation(project(":main", "mainResources"))
@@ -72,7 +72,6 @@
 
 tasks {
   withType<JavaCompile> {
-    dependsOn(keepAnnoCompileJavaTask)
     dependsOn(resourceShrinkerCompileJavaTask)
     dependsOn(sharedDownloadDepsTask)
     dependsOn(sharedDownloadTestDepsTask)
@@ -98,12 +97,12 @@
 
   val assembleDepsJar by
     registering(Jar::class) {
-      dependsOn(keepAnnoJarTask)
+      dependsOn(keepAnnoJarConfig)
       dependsOn(resourceShrinkerDepsJarTask)
       dependsOn(sharedDownloadDepsTask)
       dependsOn(sharedDownloadTestDepsTask)
       from(Callable { testDependencies().map(::zipTree) })
-      from(Callable { keepAnnoJarTask.outputs.getFiles().map(::zipTree) })
+      from(keepAnnoJarConfig.map(::zipTree))
       from(Callable { resourceShrinkerDepsJarTask.outputs.getFiles().map(::zipTree) })
       exclude("com/android/tools/r8/keepanno/annotations/**")
       exclude("androidx/annotation/keep/**")
diff --git a/d8_r8/test_modules/tests_bootstrap/build.gradle.kts b/d8_r8/test_modules/tests_bootstrap/build.gradle.kts
index 69e7dd9..33eabdd 100644
--- a/d8_r8/test_modules/tests_bootstrap/build.gradle.kts
+++ b/d8_r8/test_modules/tests_bootstrap/build.gradle.kts
@@ -21,17 +21,19 @@
 
 val distR8WithRelocatedDeps = project(":dist").tasks.getByName("r8WithRelocatedDeps")
 val distSwissArmyKnife = project(":dist").tasks.getByName("swissArmyKnife")
-val keepAnnoCompileJavaTask = projectTask("keepanno", "compileJava")
-val keepAnnoCompileKotlinTask = projectTask("keepanno", "compileKotlin")
-val keepAnnoJarTask = projectTask("keepanno", "jar")
 val resourceShrinkerCompileJavaTask = projectTask("resourceshrinker", "compileJava")
 val resourceShrinkerCompileKotlinTask = projectTask("resourceshrinker", "compileKotlin")
 val resourceShrinkerDepsJarTask = projectTask("resourceshrinker", "depsJar")
 val sharedDownloadDepsTask = projectTask("shared", "downloadDeps")
 val sharedDownloadDepsInternalTask = projectTask("shared", "downloadDepsInternal")
 
+val keepAnnoClassesScope by configurations.dependencyScope("keepAnnoClassesScope")
+val keepAnnoClassesConfig by
+  configurations.resolvable("keepAnnoClassesConfig") { extendsFrom(keepAnnoClassesScope) }
+
 dependencies {
-  implementation(keepAnnoJarTask.outputs.files)
+  keepAnnoClassesScope(project(":keepanno", "keepannoClasses"))
+  implementation(project(":keepanno", "keepannoClasses"))
   implementation(project(":main", "mainJar"))
   implementation(resourceShrinkerCompileJavaTask.outputs.files)
   implementation(resourceShrinkerCompileKotlinTask.outputs.files)
@@ -72,11 +74,7 @@
     systemProperty(
       "BUILD_PROP_KEEPANNO_RUNTIME_PATH",
       project.provider {
-        extractClassesPaths(
-          "keepanno" + File.separator,
-          keepAnnoCompileJavaTask.outputs.files.asPath,
-          keepAnnoCompileKotlinTask.outputs.files.asPath,
-        )
+        extractClassesPaths("keepanno" + File.separator, keepAnnoClassesConfig.asPath)
       },
     )
     systemProperty("R8_SWISS_ARMY_KNIFE", distSwissArmyKnife.outputs.files.singleFile)
@@ -93,7 +91,6 @@
 
   val assembleDepsJar by
     registering(Jar::class) {
-      dependsOn(keepAnnoJarTask)
       dependsOn(sharedDownloadDepsTask)
       if (!project.hasProperty("no_internal")) {
         dependsOn(sharedDownloadDepsInternalTask)
diff --git a/d8_r8/test_modules/tests_java_8/build.gradle.kts b/d8_r8/test_modules/tests_java_8/build.gradle.kts
index e64097b..4d14df1 100644
--- a/d8_r8/test_modules/tests_java_8/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_8/build.gradle.kts
@@ -28,6 +28,9 @@
 
 // If we depend on keepanno by referencing the project source outputs we get an error regarding
 // incompatible java class file version. By depending on the jar we circumvent that.
+val keepAnnoClassesScope by configurations.dependencyScope("keepAnnoClassesScope")
+val keepAnnoClassesConfig by
+  configurations.resolvable("keepAnnoClassesConfig") { extendsFrom(keepAnnoClassesScope) }
 val assistantClassesScope by configurations.dependencyScope("assistantClassesScope")
 val assistantClassesOutput =
   configurations.resolvable("assistantClassesOutput") { extendsFrom(assistantClassesScope) }
@@ -41,9 +44,6 @@
 val turboClassesScope by configurations.dependencyScope("turboClassesScope")
 val turboClassesOutput =
   configurations.resolvable("turboClassesOutput") { extendsFrom(turboClassesScope) }
-val keepAnnoJarTask = projectTask("keepanno", "jar")
-val keepAnnoCompileJavaTask = projectTask("keepanno", "compileJava")
-val keepAnnoCompileKotlinTask = projectTask("keepanno", "compileKotlin")
 val resourceShrinkerCompileJavaTask = projectTask("resourceshrinker", "compileJava")
 val resourceShrinkerCompileKotlinTask = projectTask("resourceshrinker", "compileKotlin")
 val resourceShrinkerDepsJarTask = projectTask("resourceshrinker", "depsJar")
@@ -51,6 +51,7 @@
 val sharedDownloadDepsInternalTask = projectTask("shared", "downloadDepsInternal")
 
 dependencies {
+  keepAnnoClassesScope(project(":keepanno", "keepannoClasses"))
   assistantClassesScope(project(":assistant", "assistantJar"))
   distDepsFilesScope(project(":dist", "depsFiles"))
   mainClassesScope(project(":main", "mainClassesOutput"))
@@ -58,7 +59,7 @@
   turboClassesScope(project(":main", "turboClassesOutput"))
   implementation(project(":assistant", "assistantJar"))
   implementation(project(":blastradius", "blastradiusJar"))
-  implementation(keepAnnoJarTask.outputs.files)
+  implementation(project(":keepanno", "keepannoClasses"))
   implementation(project(":libanalyzer", "libanalyzer-compile-java"))
   implementation(project(":main", "mainClassesOutput"))
   implementation(project(":main", "mainResources"))
@@ -107,7 +108,6 @@
   }
   withType<JavaCompile> {
     dependsOn(createArtTests)
-    dependsOn(keepAnnoCompileJavaTask)
     dependsOn(resourceShrinkerCompileJavaTask)
     dependsOn(sharedDownloadDepsTask)
     dependsOn(":testbase:compileJava")
@@ -150,11 +150,7 @@
     )
     systemProperty(
       "BUILD_PROP_KEEPANNO_RUNTIME_PATH",
-      extractClassesPaths(
-        "keepanno" + File.separator,
-        keepAnnoCompileJavaTask.outputs.files.asPath,
-        keepAnnoCompileKotlinTask.outputs.files.asPath,
-      ),
+      extractClassesPaths("keepanno" + File.separator, keepAnnoClassesConfig.asPath),
     )
     // This path is set when compiling examples jar task in DependenciesPlugin.
     val r8RuntimePath =
@@ -166,7 +162,7 @@
         File.pathSeparator +
         project.files(mainResources).asPath.split(File.pathSeparator)[0] +
         File.pathSeparator +
-        keepAnnoCompileJavaTask.outputs.files.getAsPath().split(File.pathSeparator)[0] +
+        keepAnnoClassesConfig.asPath +
         File.pathSeparator +
         project.files(assistantClassesOutput).asPath.split(File.pathSeparator)[0] +
         File.pathSeparator +
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 39c9fbb..1bfc4c8 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -26,7 +26,9 @@
 
 project(":blastradius").projectDir = file("d8_r8/blastradius")
 
-includeBuild(rootProject.projectDir.resolve("d8_r8/keepanno"))
+include(":keepanno")
+
+project(":keepanno").projectDir = file("d8_r8/keepanno")
 
 include(":libanalyzer")