|
22 | 22 | import io.spring.initializr.generator.project.ProjectDescription; |
23 | 23 | import io.spring.initializr.generator.spring.build.BuildCustomizer; |
24 | 24 | import io.spring.initializr.generator.spring.build.BuildMetadataResolver; |
| 25 | +import io.spring.initializr.generator.version.Version; |
| 26 | +import io.spring.initializr.generator.version.VersionParser; |
| 27 | +import io.spring.initializr.generator.version.VersionRange; |
25 | 28 | import io.spring.initializr.metadata.InitializrMetadata; |
26 | 29 |
|
27 | 30 | /** |
|
30 | 33 | * |
31 | 34 | * @author Stephane Nicoll |
32 | 35 | * @author Madhura Bhave |
| 36 | + * @author Moritz Halbritter |
33 | 37 | */ |
34 | 38 | public class ReactorTestBuildCustomizer implements BuildCustomizer<Build> { |
35 | 39 |
|
| 40 | + private static final VersionRange SPRING_BOOT_4_0_RC2_OR_LATER = VersionParser.DEFAULT.parseRange("4.0.0-RC2"); |
| 41 | + |
36 | 42 | private final BuildMetadataResolver buildResolver; |
37 | 43 |
|
| 44 | + private final Version bootVersion; |
| 45 | + |
38 | 46 | public ReactorTestBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { |
| 47 | + this.bootVersion = description.getPlatformVersion(); |
39 | 48 | this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); |
40 | 49 | } |
41 | 50 |
|
42 | 51 | @Override |
43 | 52 | public void customize(Build build) { |
44 | | - if (this.buildResolver.hasFacet(build, "reactive")) { |
| 53 | + if (shouldAddReactorTestDependency(build)) { |
45 | 54 | build.dependencies() |
46 | 55 | .add("reactor-test", Dependency.withCoordinates("io.projectreactor", "reactor-test") |
47 | 56 | .scope(DependencyScope.TEST_COMPILE)); |
48 | 57 | } |
49 | 58 | } |
50 | 59 |
|
| 60 | + private boolean shouldAddReactorTestDependency(Build build) { |
| 61 | + if (SPRING_BOOT_4_0_RC2_OR_LATER.match(this.bootVersion)) { |
| 62 | + // Starting with Boot 4.0.0-RC2, all Spring Boot reactive starters have a |
| 63 | + // dependency on io.projectreactor:reactor-test in their test starter |
| 64 | + return this.buildResolver.dependencies(build) |
| 65 | + .anyMatch((dependency) -> hasReactiveFacet(dependency) && !isSpringBootStarter(dependency)); |
| 66 | + } |
| 67 | + return this.buildResolver.hasFacet(build, "reactive"); |
| 68 | + } |
| 69 | + |
| 70 | + private boolean hasReactiveFacet(io.spring.initializr.metadata.Dependency dependency) { |
| 71 | + return dependency.getFacets().contains("reactive"); |
| 72 | + } |
| 73 | + |
| 74 | + private boolean isSpringBootStarter(io.spring.initializr.metadata.Dependency dependency) { |
| 75 | + return dependency.isStarter() && dependency.getGroupId().equals("org.springframework.boot"); |
| 76 | + } |
| 77 | + |
51 | 78 | } |
0 commit comments