From 4b8db9b630ea94c186ea944555c89df63e9334df Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 21 Nov 2025 16:57:56 +0000 Subject: [PATCH] Fix problems with auto-configuration architecture checks Closes gh-48216 --- .../boot/build/architecture/ArchitectureRules.java | 11 +++++++++-- .../build/architecture/AutoConfigurationChecker.java | 6 +++++- .../classconditions/MyAutoConfiguration.java | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java index a6f72135850..2b433c24315 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java @@ -421,6 +421,8 @@ final class ArchitectureRules { return ArchRuleDefinition.members() .that() .areDeclaredInClassesThat(areRegularAutoConfiguration()) + .and() + .areDeclaredInClassesThat(areNotKotlinClasses()) .and(areNotDefaultConstructors()) .and(areNotConstants()) .and(dontOverridePublicMethods()) @@ -440,13 +442,18 @@ final class ArchitectureRules { } static DescribedPredicate areRegularAutoConfiguration() { - return DescribedPredicate.describe("Regular @AutoConfiguration", + return DescribedPredicate.describe("are regular @AutoConfiguration", (javaClass) -> javaClass.isAnnotatedWith(AUTOCONFIGURATION_ANNOTATION) && !javaClass.getName().contains("TestAutoConfiguration") && !javaClass.isAnnotation()); } + static DescribedPredicate areNotKotlinClasses() { + return DescribedPredicate.describe("are not Kotlin classes", + (javaClass) -> !javaClass.isAnnotatedWith("kotlin.Metadata")); + } + static DescribedPredicate areTestAutoConfiguration() { - return DescribedPredicate.describe("Test @AutoConfiguration", + return DescribedPredicate.describe("are test @AutoConfiguration", (javaClass) -> javaClass.isAnnotatedWith(AUTOCONFIGURATION_ANNOTATION) && javaClass.getName().contains("TestAutoConfiguration") && !javaClass.isAnnotation()); } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/architecture/AutoConfigurationChecker.java b/buildSrc/src/main/java/org/springframework/boot/build/architecture/AutoConfigurationChecker.java index d5935f27fba..c1d7ee9d131 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/architecture/AutoConfigurationChecker.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/architecture/AutoConfigurationChecker.java @@ -31,12 +31,16 @@ import org.springframework.util.ReflectionUtils; /** * Finds all configurations from auto-configurations (either nested configurations or * imported ones) and checks that these classes don't contain public members. + *

+ * Kotlin classes are ignored as Kotlin does not have package-private visibility and + * {@code internal} isn't a good substitute. * * @author Moritz Halbritter */ class AutoConfigurationChecker { - private final DescribedPredicate isAutoConfiguration = ArchitectureRules.areRegularAutoConfiguration(); + private final DescribedPredicate isAutoConfiguration = ArchitectureRules.areRegularAutoConfiguration() + .and(ArchitectureRules.areNotKotlinClasses()); EvaluationResult check(JavaClasses javaClasses) { AutoConfigurations autoConfigurations = new AutoConfigurations(); diff --git a/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/developingautoconfiguration/conditionannotations/classconditions/MyAutoConfiguration.java b/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/developingautoconfiguration/conditionannotations/classconditions/MyAutoConfiguration.java index 895e7cce92f..e71feb2971d 100644 --- a/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/developingautoconfiguration/conditionannotations/classconditions/MyAutoConfiguration.java +++ b/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/developingautoconfiguration/conditionannotations/classconditions/MyAutoConfiguration.java @@ -30,11 +30,11 @@ public final class MyAutoConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnClass(SomeService.class) - public static class SomeServiceConfiguration { + static class SomeServiceConfiguration { @Bean @ConditionalOnMissingBean - public SomeService someService() { + SomeService someService() { return new SomeService(); }