diff --git a/spring-modulith-core/pom.xml b/spring-modulith-core/pom.xml
index 040b45e6..821ea3a2 100644
--- a/spring-modulith-core/pom.xml
+++ b/spring-modulith-core/pom.xml
@@ -40,6 +40,11 @@
org.springframework
spring-core
+
+
+ org.springframework
+ spring-context
+
org.springframework.boot
@@ -73,12 +78,6 @@
true
-
- org.springframework
- spring-context
- test
-
-
org.springframework
spring-tx
diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java
index 338f2d72..d14caa64 100644
--- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java
+++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java
@@ -18,12 +18,17 @@ package org.springframework.modulith.core;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;
+import java.util.Set;
import java.util.stream.Stream;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.modulith.Modulith;
import org.springframework.modulith.Modulithic;
import org.springframework.modulith.core.Types.SpringTypes;
import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
/**
* Core metadata about the modulithic application.
@@ -56,13 +61,26 @@ public interface ModulithMetadata {
}
/**
- * Creates a new {@link ModulithMetadata} instance for the given package.
+ * Creates a new {@link ModulithMetadata} instance for the given package. Inspects the package for classes annotated
+ * with {@link Modulithic} to pick up additional configuration.
*
* @param javaPackage must not be {@literal null} or empty.
* @return will never be {@literal null}.
*/
public static ModulithMetadata of(String javaPackage) {
- return SpringBootModulithMetadata.of(javaPackage);
+
+ var provider = new ClassPathScanningCandidateComponentProvider(false);
+ provider.addIncludeFilter(new AnnotationTypeFilter(Modulithic.class));
+
+ Set candidates = provider.findCandidateComponents(javaPackage);
+
+ if (candidates.size() != 1) {
+ return SpringBootModulithMetadata.of(javaPackage);
+ }
+
+ var className = candidates.iterator().next().getBeanClassName();
+
+ return of(ClassUtils.resolveClassName(className, ModulithMetadata.class.getClassLoader()));
}
/**
diff --git a/spring-modulith-core/src/test/java/empty/EmptyApplication.java b/spring-modulith-core/src/test/java/empty/EmptyApplication.java
index 54146492..f8b4d3d6 100644
--- a/spring-modulith-core/src/test/java/empty/EmptyApplication.java
+++ b/spring-modulith-core/src/test/java/empty/EmptyApplication.java
@@ -20,5 +20,5 @@ import org.springframework.modulith.Modulithic;
/**
* @author Oliver Drotbohm
*/
-@Modulithic
+@Modulithic(systemName = "customSystemName")
public class EmptyApplication {}
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 8c31c076..1a844acc 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
@@ -74,6 +74,14 @@ class ModulithMetadataUnitTest {
assertThat(metadata.getBasePackages()).containsExactly(getClass().getPackageName());
}
+ @Test // GH-1015
+ void considersModulithicOnPackageLookup() {
+
+ var metadata = ModulithMetadata.of("empty");
+
+ assertThat(metadata.getSystemName()).hasValue("customSystemName");
+ }
+
@Modulith(additionalPackages = "com.acme.foo", //
sharedModules = "shared.module", //
systemName = "systemName", //