diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/AnnotationModulithMetadata.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/AnnotationModulithMetadata.java index 2853f226..d1bc0dec 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/AnnotationModulithMetadata.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/AnnotationModulithMetadata.java @@ -134,8 +134,14 @@ class AnnotationModulithMetadata implements ModulithMetadata { @Override public List getBasePackages() { - var result = new ArrayList<>(List.of(basePackage)); - result.addAll(List.of(annotation.additionalPackages())); + var result = new ArrayList(); + result.add(basePackage); + + for (var candidate : annotation.additionalPackages()) { + if (!result.contains(candidate)) { + result.add(candidate); + } + } return result; } 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 02ae5831..fa2d5809 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 @@ -139,12 +139,14 @@ public class ApplicationModules implements Iterable { var strategy = ApplicationModuleDetectionStrategyLookup.getStrategy(); this.modules = packages.stream() // + .distinct() .map(it -> JavaPackage.of(classes, it)) .flatMap(strategy::getModuleBasePackages) // .map(it -> new ApplicationModule(it, useFullyQualifiedModuleNames)) // .collect(toMap(ApplicationModule::getName, Function.identity())); this.rootPackages = packages.stream() // + .distinct() .map(it -> JavaPackage.of(classes, it).toSingle()) // .toList(); diff --git a/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java b/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java index 6c12242c..6bafceed 100644 --- a/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java +++ b/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java @@ -66,6 +66,14 @@ class ModulithMetadataUnitTest { .withMessageContaining(SpringBootApplication.class.getSimpleName()); } + @Test // GH-798 + void returnsUniqueBasePackages() { + + var metadata = ModulithMetadata.of(AdditionalPackagesShadowing.class); + + assertThat(metadata.getBasePackages()).containsExactly(getClass().getPackageName()); + } + @Modulith(additionalPackages = "com.acme.foo", // sharedModules = "shared.module", // systemName = "systemName", // @@ -82,4 +90,7 @@ class ModulithMetadataUnitTest { static class SpringBootApplicationAnnotated {} static class Unannotated {} + + @Modulithic(additionalPackages = "org.springframework.modulith.core") + static class AdditionalPackagesShadowing {} }