diff --git a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitecturePlugin.java b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitecturePlugin.java index 2433fab9800..88b047f52f9 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitecturePlugin.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitecturePlugin.java @@ -16,17 +16,17 @@ package org.springframework.boot.build.architecture; -import java.util.ArrayList; -import java.util.List; +import java.util.Collections; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.Task; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.TaskProvider; +import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.language.base.plugins.LifecycleBasePlugin; +import org.jetbrains.kotlin.gradle.tasks.KotlinCompileTool; import org.springframework.util.StringUtils; @@ -46,28 +46,45 @@ public class ArchitecturePlugin implements Plugin { private void registerTasks(Project project, ArchitectureCheckExtension extension) { JavaPluginExtension javaPluginExtension = project.getExtensions().getByType(JavaPluginExtension.class); - List> packageTangleChecks = new ArrayList<>(); for (SourceSet sourceSet : javaPluginExtension.getSourceSets()) { - TaskProvider checkPackageTangles = project.getTasks() - .register("checkArchitecture" + StringUtils.capitalize(sourceSet.getName()), ArchitectureCheck.class, - (task) -> { - task.getSourceSet().set(sourceSet.getName()); - task.getCompileClasspath().from(sourceSet.getCompileClasspath()); - task.setClasses(sourceSet.getOutput().getClassesDirs()); - task.getResourcesDirectory().set(sourceSet.getOutput().getResourcesDir()); - task.dependsOn(sourceSet.getProcessResourcesTaskName()); - task.setDescription("Checks the architecture of the classes of the " + sourceSet.getName() - + " source set."); - task.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP); - task.getNullMarkedEnabled().set(extension.getNullMarked().getEnabled()); - task.getNullMarkedIgnoredPackages().set(extension.getNullMarked().getIgnoredPackages()); - }); - packageTangleChecks.add(checkPackageTangles); - } - if (!packageTangleChecks.isEmpty()) { - TaskProvider checkTask = project.getTasks().named(LifecycleBasePlugin.CHECK_TASK_NAME); - checkTask.configure((check) -> check.dependsOn(packageTangleChecks)); + registerArchitectureCheck(sourceSet, "java", project).configure((task) -> { + task.setClasses(project.files(project.getTasks() + .named(sourceSet.getCompileTaskName("java"), JavaCompile.class) + .flatMap((compile) -> compile.getDestinationDirectory()))); + task.getNullMarkedEnabled().set(extension.getNullMarked().getEnabled()); + task.getNullMarkedIgnoredPackages().set(extension.getNullMarked().getIgnoredPackages()); + }); + project.getPlugins() + .withId("org.jetbrains.kotlin.jvm", + (kotlinPlugin) -> registerArchitectureCheck(sourceSet, "kotlin", project).configure((task) -> { + task.setClasses(project.files(project.getTasks() + .named(sourceSet.getCompileTaskName("kotlin"), KotlinCompileTool.class) + .flatMap((compile) -> compile.getDestinationDirectory()))); + task.getNullMarkedEnabled().set(false); + task.getNullMarkedIgnoredPackages().set(Collections.emptySet()); + })); } } + private TaskProvider registerArchitectureCheck(SourceSet sourceSet, String language, + Project project) { + TaskProvider checkArchitecture = project.getTasks() + .register( + "checkArchitecture" + + StringUtils.capitalize(sourceSet.getName() + StringUtils.capitalize(language)), + ArchitectureCheck.class, (task) -> { + task.getSourceSet().set(sourceSet.getName()); + task.getCompileClasspath().from(sourceSet.getCompileClasspath()); + task.getResourcesDirectory().set(sourceSet.getOutput().getResourcesDir()); + task.dependsOn(sourceSet.getProcessResourcesTaskName()); + task.setDescription("Checks the architecture of the " + language + " classes of the " + + sourceSet.getName() + " source set."); + task.setGroup(LifecycleBasePlugin.VERIFICATION_GROUP); + }); + project.getTasks() + .named(LifecycleBasePlugin.CHECK_TASK_NAME) + .configure((check) -> check.dependsOn(checkArchitecture)); + return checkArchitecture; + } + } diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java index 7cb90768412..c791ea70d17 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java @@ -423,7 +423,7 @@ class ArchitectureCheckTests { @Override public String toString() { - return "checkArchitecture" + StringUtils.capitalize(this.sourceSetName); + return "checkArchitecture" + StringUtils.capitalize(this.sourceSetName) + "Java"; } } diff --git a/loader/spring-boot-loader/build.gradle b/loader/spring-boot-loader/build.gradle index 5fbc9f19e50..c4305d3a407 100644 --- a/loader/spring-boot-loader/build.gradle +++ b/loader/spring-boot-loader/build.gradle @@ -32,7 +32,7 @@ dependencies { } tasks.configureEach { - if ("checkArchitectureMain".equals(it.name)) { + if ("checkArchitectureMainJava".equals(it.name)) { prohibitObjectsRequireNonNull = false } }