Skip to content

Commit b95b0c0

Browse files
committed
GH-798 - Guard against multiple non-unique module base packages.
1 parent 86eae79 commit b95b0c0

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

spring-modulith-core/src/main/java/org/springframework/modulith/core/AnnotationModulithMetadata.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,14 @@ public Optional<String> getSystemName() {
134134
@Override
135135
public List<String> getBasePackages() {
136136

137-
var result = new ArrayList<>(List.of(basePackage));
138-
result.addAll(List.of(annotation.additionalPackages()));
137+
var result = new ArrayList<String>();
138+
result.add(basePackage);
139+
140+
for (var candidate : annotation.additionalPackages()) {
141+
if (!result.contains(candidate)) {
142+
result.add(candidate);
143+
}
144+
}
139145

140146
return result;
141147
}

spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,14 @@ protected ApplicationModules(ModulithMetadata metadata, Collection<String> packa
139139
var strategy = ApplicationModuleDetectionStrategyLookup.getStrategy();
140140

141141
this.modules = packages.stream() //
142+
.distinct()
142143
.map(it -> JavaPackage.of(classes, it))
143144
.flatMap(strategy::getModuleBasePackages) //
144145
.map(it -> new ApplicationModule(it, useFullyQualifiedModuleNames)) //
145146
.collect(toMap(ApplicationModule::getName, Function.identity()));
146147

147148
this.rootPackages = packages.stream() //
149+
.distinct()
148150
.map(it -> JavaPackage.of(classes, it).toSingle()) //
149151
.toList();
150152

spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ public void rejectsTypeNotAnnotatedWithEitherModulithAnnotationOrSpringBootAppli
6666
.withMessageContaining(SpringBootApplication.class.getSimpleName());
6767
}
6868

69+
@Test // GH-798
70+
void returnsUniqueBasePackages() {
71+
72+
var metadata = ModulithMetadata.of(AdditionalPackagesShadowing.class);
73+
74+
assertThat(metadata.getBasePackages()).containsExactly(getClass().getPackageName());
75+
}
76+
6977
@Modulith(additionalPackages = "com.acme.foo", //
7078
sharedModules = "shared.module", //
7179
systemName = "systemName", //
@@ -82,4 +90,7 @@ static class ModuliticAnnotated {}
8290
static class SpringBootApplicationAnnotated {}
8391

8492
static class Unannotated {}
93+
94+
@Modulithic(additionalPackages = "org.springframework.modulith.core")
95+
static class AdditionalPackagesShadowing {}
8596
}

0 commit comments

Comments
 (0)