From 636b5988cb535793d46380178e68302adeb48197 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 4 Sep 2024 09:51:48 +0200 Subject: [PATCH] GH-797 - Guard against multiple non-unique module base packages. --- .../modulith/core/AnnotationModulithMetadata.java | 10 ++++++++-- .../modulith/core/ApplicationModules.java | 2 ++ .../modulith/core/ModulithMetadataUnitTest.java | 11 +++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) 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 @@ public Optional getSystemName() { @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 49fd82f2..a50ac793 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 @@ -141,6 +141,7 @@ protected ApplicationModules(ModulithMetadata metadata, Collection packa pkgs -> importer.importPackages(pkgs).that(not(excluded)), strategy, useFullyQualifiedModuleNames); var directSources = packages.stream() // + .distinct() .map(it -> JavaPackage.of(classes, it)) .flatMap(it -> ApplicationModuleSource.from(it, strategy, useFullyQualifiedModuleNames)); @@ -158,6 +159,7 @@ protected ApplicationModules(ModulithMetadata metadata, Collection packa .collect(toMap(ApplicationModule::getName, Function.identity())); this.rootPackages = Stream.concat(packages.stream(), contributions.getRootPackages()) // + .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..681a23de 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 @@ public void rejectsTypeNotAnnotatedWithEitherModulithAnnotationOrSpringBootAppli .withMessageContaining(SpringBootApplication.class.getSimpleName()); } + @Test // GH-797 + 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 @@ static class ModuliticAnnotated {} static class SpringBootApplicationAnnotated {} static class Unannotated {} + + @Modulithic(additionalPackages = "org.springframework.modulith.core") + static class AdditionalPackagesShadowing {} }