diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java index ecfbe96e..9220b56e 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java @@ -340,13 +340,16 @@ public class ApplicationModules implements Iterable { * modules. * * @param className must not be {@literal null} or empty. - * @return */ public boolean withinRootPackages(String className) { Assert.hasText(className, "Class name must not be null or empty!"); - return rootPackages.stream().anyMatch(it -> it.contains(className)); + var candidate = PackageName.ofType(className); + + return rootPackages.stream() + .map(JavaPackage::getPackageName) + .anyMatch(candidate::equals); } /** diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/JavaPackage.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/JavaPackage.java index 5f19c989..b4cc818d 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/JavaPackage.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/JavaPackage.java @@ -293,9 +293,9 @@ public class JavaPackage implements DescribedIterable, Comparable { +public class PackageName implements Comparable { private static final Map PACKAGE_NAMES = new HashMap<>(); @@ -68,8 +68,9 @@ class PackageName implements Comparable { * * @param fullyQualifiedName must not be {@literal null} or empty. * @return will never be {@literal null}. + * @since 1.4 */ - static PackageName ofType(String fullyQualifiedName) { + public static PackageName ofType(String fullyQualifiedName) { Assert.notNull(fullyQualifiedName, "Type name must not be null!"); @@ -191,8 +192,9 @@ class PackageName implements Comparable { * sub-package of it. * * @param reference must not be {@literal null}. + * @since 1.4 */ - boolean contains(PackageName reference) { + public boolean contains(PackageName reference) { Assert.notNull(reference, "Reference package name must not be null!"); diff --git a/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleTestExecution.java b/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleTestExecution.java index 828f7f9c..b71a1333 100644 --- a/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleTestExecution.java +++ b/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleTestExecution.java @@ -36,6 +36,7 @@ import org.springframework.modulith.core.ApplicationModule; import org.springframework.modulith.core.ApplicationModules; import org.springframework.modulith.core.ApplicationModulesFactory; import org.springframework.modulith.core.JavaPackage; +import org.springframework.modulith.core.PackageName; import org.springframework.modulith.test.ApplicationModuleTest.BootstrapMode; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -134,8 +135,7 @@ public class ModuleTestExecution implements Iterable { public boolean includes(String className) { - var result = modules.withinRootPackages(className) // - || basePackages.get().stream().anyMatch(it -> it.contains(className)); + var result = isLocatedInRootPackageOrContainedInBasePackages(className); if (result) { LOGGER.trace("Including class {}.", className); @@ -239,6 +239,17 @@ public class ModuleTestExecution implements Iterable { return Objects.hash(key); } + private boolean isLocatedInRootPackageOrContainedInBasePackages(String className) { + + if (modules.withinRootPackages(className)) { + return true; + } + + var candidate = PackageName.ofType(className); + + return basePackages.get().stream().map(JavaPackage::getPackageName).anyMatch(it -> it.contains(candidate)); + } + private static Stream getExtraModules(ApplicationModuleTest annotation, ApplicationModules modules) {