val pluginDir: File by rootProject.extra plugins { kotlin("jvm") } subprojects { apply(plugin = "org.jetbrains.kotlin.jvm") dependencies { implementation(project(":plugin-api")) } tasks.register("plugin") { archiveBaseName.set("plugin-${project.name}") // first taking the classes generated by the jar task into("classes") { with(tasks.named("jar").get()) } // and then we also need to include any libraries that are needed by the plugin dependsOn(configurations.runtimeClasspath) into("lib") { from({ configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") } }) } archiveExtension.set("jar") } tasks.register("assemblePlugin") { from(project.tasks.named("plugin")) into(pluginDir) } tasks.jar { manifest { from("./src/main/resources/MANIFEST.MF") } } tasks.named("build") { dependsOn(tasks.named("plugin")) } } tasks.register("assemblePlugins") { dependsOn(subprojects.map { it.tasks.named("assemblePlugin") }) } tasks { "build" { dependsOn(named("assemblePlugins")) } }