From 922683186b4216c325ffed1870c5378e62b0fa47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=8A=B9=ED=98=84?= Date: Wed, 14 Oct 2026 14:06:11 +0900 Subject: [PATCH] GH-1962 - Fix Flyway migration discovery for dotted module identifiers. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: μ•ˆμŠΉν˜„ --- .../runtime/flyway/HasMigrationFiles.java | 3 ++- ...ringModulithFlywayCustomizerUnitTests.java | 19 +++++++++++++++++++ .../db/migration/fully/qualified/V1__init.sql | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 spring-modulith-runtime/src/test/resources/db/migration/fully/qualified/V1__init.sql diff --git a/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/flyway/HasMigrationFiles.java b/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/flyway/HasMigrationFiles.java index c2759378d..8424bb0fb 100644 --- a/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/flyway/HasMigrationFiles.java +++ b/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/flyway/HasMigrationFiles.java @@ -63,9 +63,10 @@ public boolean shouldMigrate(ApplicationModuleIdentifier identifier, Flyway flyw } private int getNumberOfMigrationFiles(Location location, ApplicationModuleIdentifier identifier) { + var asPath = identifier.toString().replace('.', '/'); try { - return resolver.getResources("%s/%s/*".formatted(location, identifier.toString())).length; + return resolver.getResources("%s/%s/*".formatted(location, asPath)).length; } catch (FileNotFoundException e) { return 0; } catch (IOException e) { diff --git a/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/flyway/SpringModulithFlywayCustomizerUnitTests.java b/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/flyway/SpringModulithFlywayCustomizerUnitTests.java index 65b1ddbdb..b90012ca6 100644 --- a/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/flyway/SpringModulithFlywayCustomizerUnitTests.java +++ b/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/flyway/SpringModulithFlywayCustomizerUnitTests.java @@ -100,6 +100,25 @@ void dropModulesWithoutMigrations() { }); } + @Test // GH-1962 + void retainsModulesWithMigrationsForDottedIdentifiers() { + + var identifiers = ApplicationModuleIdentifiers.of(List.of( + ApplicationModuleIdentifier.of("fully.qualified"))); + + var filter = new HasMigrationFiles(new PathMatchingResourcePatternResolver()); + + var result = new SpringModulithFlywayCustomizer(Flyway.configure().load(), filter) + .augment(identifiers) + .toList(); + + assertThat(result).hasSize(2); + + assertThat(result.get(1).getConfiguration().getLocations()) + .extracting(Location::toString) + .containsExactly("classpath:db/migration/fully/qualified"); + } + @Builder @ToString @RequiredArgsConstructor diff --git a/spring-modulith-runtime/src/test/resources/db/migration/fully/qualified/V1__init.sql b/spring-modulith-runtime/src/test/resources/db/migration/fully/qualified/V1__init.sql new file mode 100644 index 000000000..319ed7cd5 --- /dev/null +++ b/spring-modulith-runtime/src/test/resources/db/migration/fully/qualified/V1__init.sql @@ -0,0 +1 @@ +-- nested module migration