diff --git a/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/CheckAutoConfigurationClasses.java b/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/CheckAutoConfigurationClasses.java index 764d4c51afe..77349c71ca4 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/CheckAutoConfigurationClasses.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/CheckAutoConfigurationClasses.java @@ -37,6 +37,7 @@ import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.FileCollection; import org.gradle.api.provider.SetProperty; import org.gradle.api.tasks.Classpath; +import org.gradle.api.tasks.Input; import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.VerificationException; @@ -113,16 +114,20 @@ public abstract class CheckAutoConfigurationClasses extends AutoConfigurationImp @OutputDirectory public abstract DirectoryProperty getOutputDirectory(); + @Input + public abstract SetProperty getOmittedFromImports(); + @TaskAction void execute() { Map> problems = new TreeMap<>(); Set optionalOnlyClassNames = new HashSet<>(this.optionalDependencyClassNames.get()); Set requiredClassNames = this.requiredDependencyClassNames.get(); optionalOnlyClassNames.removeAll(requiredClassNames); + List imports = loadImports(); classFiles().forEach((classFile) -> { AutoConfigurationClass autoConfigurationClass = AutoConfigurationClass.of(classFile); if (autoConfigurationClass != null) { - check(autoConfigurationClass, optionalOnlyClassNames, requiredClassNames, problems); + check(autoConfigurationClass, optionalOnlyClassNames, requiredClassNames, imports, problems); } }); File outputFile = getOutputDirectory().file("failure-report.txt").get().getAsFile(); @@ -153,11 +158,21 @@ public abstract class CheckAutoConfigurationClasses extends AutoConfigurationImp } private void check(AutoConfigurationClass autoConfigurationClass, Set optionalOnlyClassNames, - Set requiredClassNames, Map> problems) { + Set requiredClassNames, List imports, Map> problems) { if (!autoConfigurationClass.name().endsWith("AutoConfiguration")) { problems.computeIfAbsent(autoConfigurationClass.name(), (name) -> new ArrayList<>()) .add("Name of a class annotated with @AutoConfiguration should end with AutoConfiguration"); } + if (!getOmittedFromImports().getOrElse(Collections.emptySet()).contains(autoConfigurationClass.name()) + && !imports.contains(autoConfigurationClass.name())) { + problems.computeIfAbsent(autoConfigurationClass.name(), (name) -> new ArrayList<>()) + .add("Class is not registered in AutoConfiguration.imports"); + } + if (getOmittedFromImports().getOrElse(requiredClassNames).contains(autoConfigurationClass.name()) + && imports.contains(autoConfigurationClass.name())) { + problems.computeIfAbsent(autoConfigurationClass.name(), (name) -> new ArrayList<>()) + .add("Class should not be registered in AutoConfiguration.imports"); + } autoConfigurationClass.before().forEach((before) -> { if (optionalOnlyClassNames.contains(before)) { problems.computeIfAbsent(autoConfigurationClass.name(), (name) -> new ArrayList<>()) diff --git a/module/spring-boot-gson/build.gradle b/module/spring-boot-gson/build.gradle index 47a34e1f5e9..e42b05d6d72 100644 --- a/module/spring-boot-gson/build.gradle +++ b/module/spring-boot-gson/build.gradle @@ -40,3 +40,9 @@ dependencies { tasks.named("compileTestJava") { options.nullability.checking = "tests" } + +tasks.named("checkAutoConfigurationClasses") { + omittedFromImports = [ + "org.springframework.boot.gson.autoconfigure.GsonTesterTestAutoConfiguration" + ] +} diff --git a/module/spring-boot-jackson/build.gradle b/module/spring-boot-jackson/build.gradle index bc36c4383c2..16f4b9ee9e6 100644 --- a/module/spring-boot-jackson/build.gradle +++ b/module/spring-boot-jackson/build.gradle @@ -44,3 +44,9 @@ dependencies { tasks.named("compileTestJava") { options.nullability.checking = "tests" } + +tasks.named("checkAutoConfigurationClasses") { + omittedFromImports = [ + "org.springframework.boot.jackson.autoconfigure.JacksonTesterTestAutoConfiguration" + ] +} diff --git a/module/spring-boot-jackson2/build.gradle b/module/spring-boot-jackson2/build.gradle index 507ed5f1b6c..84fcef56cb3 100644 --- a/module/spring-boot-jackson2/build.gradle +++ b/module/spring-boot-jackson2/build.gradle @@ -50,3 +50,9 @@ dependencies { tasks.named("compileTestJava") { options.nullability.checking = "tests" } + +tasks.named("checkAutoConfigurationClasses") { + omittedFromImports = [ + "org.springframework.boot.jackson2.autoconfigure.Jackson2TesterTestAutoConfiguration" + ] +} diff --git a/module/spring-boot-jsonb/build.gradle b/module/spring-boot-jsonb/build.gradle index 6523f302a43..77fa134d475 100644 --- a/module/spring-boot-jsonb/build.gradle +++ b/module/spring-boot-jsonb/build.gradle @@ -41,3 +41,9 @@ dependencies { tasks.named("compileTestJava") { options.nullability.checking = "tests" } + +tasks.named("checkAutoConfigurationClasses") { + omittedFromImports = [ + "org.springframework.boot.jsonb.autoconfigure.JsonbTesterTestAutoConfiguration" + ] +} diff --git a/module/spring-boot-micrometer-metrics/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/module/spring-boot-micrometer-metrics/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index c2034e32719..3adbefa967a 100644 --- a/module/spring-boot-micrometer-metrics/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/module/spring-boot-micrometer-metrics/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -22,6 +22,7 @@ org.springframework.boot.micrometer.metrics.autoconfigure.export.statsd.StatsdMe org.springframework.boot.micrometer.metrics.autoconfigure.jvm.JvmMetricsAutoConfiguration org.springframework.boot.micrometer.metrics.autoconfigure.logging.log4j2.Log4J2MetricsAutoConfiguration org.springframework.boot.micrometer.metrics.autoconfigure.logging.logback.LogbackMetricsAutoConfiguration +org.springframework.boot.micrometer.metrics.autoconfigure.ssl.SslMetricsAutoConfiguration org.springframework.boot.micrometer.metrics.autoconfigure.startup.StartupTimeMetricsListenerAutoConfiguration org.springframework.boot.micrometer.metrics.autoconfigure.system.SystemMetricsAutoConfiguration org.springframework.boot.micrometer.metrics.autoconfigure.task.TaskExecutorMetricsAutoConfiguration diff --git a/module/spring-boot-resttestclient/build.gradle b/module/spring-boot-resttestclient/build.gradle index 2bce551e01b..475deeb79eb 100644 --- a/module/spring-boot-resttestclient/build.gradle +++ b/module/spring-boot-resttestclient/build.gradle @@ -47,3 +47,10 @@ dependencies { tasks.named("compileTestJava") { options.nullability.checking = "tests" } + +tasks.named("checkAutoConfigurationClasses") { + omittedFromImports = [ + "org.springframework.boot.resttestclient.autoconfigure.RestTestClientAutoConfiguration", + "org.springframework.boot.resttestclient.autoconfigure.TestRestTemplateAutoConfiguration" + ] +}