Skip to content

Commit ec877c1

Browse files
committed
Adapt to Spring Boot 4.0 changes regarding war deployments
Closes gh-1728
1 parent 004de45 commit ec877c1

File tree

2 files changed

+46
-28
lines changed

2 files changed

+46
-28
lines changed

initializr-generator-spring/src/main/java/io/spring/initializr/generator/spring/build/WarPackagingWebStarterBuildCustomizer.java

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package io.spring.initializr.generator.spring.build;
1818

1919
import io.spring.initializr.generator.buildsystem.Build;
20+
import io.spring.initializr.generator.buildsystem.gradle.GradleBuild;
2021
import io.spring.initializr.generator.project.ProjectDescription;
2122
import io.spring.initializr.generator.version.Version;
2223
import io.spring.initializr.generator.version.VersionParser;
@@ -37,7 +38,7 @@
3738
*/
3839
public class WarPackagingWebStarterBuildCustomizer implements BuildCustomizer<Build> {
3940

40-
private static final VersionRange SPRING_BOOT_4_RC1_OR_LATER = VersionParser.DEFAULT.parseRange("4.0.0-RC1");
41+
private static final VersionRange SPRING_BOOT_4_OR_LATER = VersionParser.DEFAULT.parseRange("4.0.0");
4142

4243
private final InitializrMetadata metadata;
4344

@@ -53,19 +54,45 @@ public WarPackagingWebStarterBuildCustomizer(InitializrMetadata metadata, Projec
5354

5455
@Override
5556
public void customize(Build build) {
57+
addWebDependency(build);
58+
if (isBoot4OrLater() && isGradleBuild(build)) {
59+
customizeGradle(build);
60+
return;
61+
}
62+
addTomcatInProvidedScope(build);
63+
}
64+
65+
private boolean isGradleBuild(Build build) {
66+
return build instanceof GradleBuild;
67+
}
68+
69+
private boolean isBoot4OrLater() {
70+
return SPRING_BOOT_4_OR_LATER.match(this.platformVersion);
71+
}
72+
73+
private void addWebDependency(Build build) {
5674
if (!this.buildMetadataResolver.hasFacet(build, "web")) {
5775
// Need to be able to bootstrap the web app
5876
Dependency dependency = determineWebDependency(this.metadata);
5977
build.dependencies()
6078
.add(dependency.getId(),
6179
MetadataBuildItemMapper.toDependency(dependency.resolve(this.platformVersion)));
6280
}
63-
// Add the tomcat starter in provided scope
81+
}
82+
83+
private void addTomcatInProvidedScope(Build build) {
6484
Dependency tomcat = determineTomcatDependency(this.metadata);
6585
tomcat.setScope(Dependency.SCOPE_PROVIDED);
6686
build.dependencies().add("tomcat", MetadataBuildItemMapper.toDependency(tomcat.resolve(this.platformVersion)));
6787
}
6888

89+
private void customizeGradle(Build build) {
90+
build.dependencies().remove("tomcat");
91+
build.dependencies()
92+
.add("tomcat-runtime", MetadataBuildItemMapper.toDependency(Dependency.create("org.springframework.boot",
93+
"spring-boot-starter-tomcat-runtime", null, Dependency.SCOPE_PROVIDED)));
94+
}
95+
6996
@Override
7097
public int getOrder() {
7198
return Ordered.LOWEST_PRECEDENCE - 10;
@@ -78,14 +105,7 @@ private Dependency determineWebDependency(InitializrMetadata metadata) {
78105

79106
private Dependency determineTomcatDependency(InitializrMetadata metadata) {
80107
Dependency tomcat = metadata.getDependencies().get("tomcat");
81-
if (tomcat != null) {
82-
return tomcat;
83-
}
84-
if (SPRING_BOOT_4_RC1_OR_LATER.match(this.platformVersion)) {
85-
return Dependency.create("org.springframework.boot", "spring-boot-tomcat-runtime", null,
86-
Dependency.SCOPE_PROVIDED);
87-
}
88-
return Dependency.createSpringBootStarter("tomcat");
108+
return (tomcat != null) ? tomcat : Dependency.createSpringBootStarter("tomcat");
89109
}
90110

91111
}

initializr-generator-spring/src/test/java/io/spring/initializr/generator/spring/build/WarPackagingWebStarterBuildCustomizerTests.java

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.util.Collections;
2020

2121
import io.spring.initializr.generator.buildsystem.Build;
22+
import io.spring.initializr.generator.buildsystem.DependencyScope;
23+
import io.spring.initializr.generator.buildsystem.gradle.GradleBuild;
2224
import io.spring.initializr.generator.buildsystem.maven.MavenBuild;
2325
import io.spring.initializr.generator.project.MutableProjectDescription;
2426
import io.spring.initializr.generator.test.InitializrMetadataTestBuilder;
@@ -28,8 +30,6 @@
2830
import io.spring.initializr.metadata.support.MetadataBuildItemResolver;
2931
import org.junit.jupiter.api.BeforeEach;
3032
import org.junit.jupiter.api.Test;
31-
import org.junit.jupiter.params.ParameterizedTest;
32-
import org.junit.jupiter.params.provider.CsvSource;
3333

3434
import static org.assertj.core.api.Assertions.assertThat;
3535

@@ -114,24 +114,22 @@ void shouldUseResolvedDependencies() {
114114
assertThat(tomcatDependency.getArtifactId()).isEqualTo("mapped-tomcat");
115115
}
116116

117-
@ParameterizedTest
118-
@CsvSource(textBlock = """
119-
3.4.0,org.springframework.boot:spring-boot-starter-tomcat
120-
3.5.0,org.springframework.boot:spring-boot-starter-tomcat
121-
4.0.0-M1,org.springframework.boot:spring-boot-starter-tomcat
122-
4.0.0-M2,org.springframework.boot:spring-boot-starter-tomcat
123-
4.0.0-M3,org.springframework.boot:spring-boot-starter-tomcat
124-
4.0.0-RC1,org.springframework.boot:spring-boot-tomcat-runtime
125-
4.0.0,org.springframework.boot:spring-boot-tomcat-runtime
126-
""")
127-
void shouldAddSpringBootTomcatRuntimeForBoot4Rc1(String bootVersion, String coordinates) {
117+
@Test
118+
void shouldCustomizeGradleBuildForBoot4() {
128119
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults().build();
129-
this.projectDescription.setPlatformVersion(Version.parse(bootVersion));
130-
Build build = createBuild(metadata);
120+
Build build = createGradleBuild(metadata, "4.0.0");
131121
new WarPackagingWebStarterBuildCustomizer(metadata, this.projectDescription).customize(build);
132-
io.spring.initializr.generator.buildsystem.Dependency tomcat = build.dependencies().get("tomcat");
133-
String actualCoordinates = tomcat.getGroupId() + ":" + tomcat.getArtifactId();
134-
assertThat(actualCoordinates).isEqualTo(coordinates);
122+
assertThat(build.dependencies().has("tomcat")).isFalse();
123+
io.spring.initializr.generator.buildsystem.Dependency dependency = build.dependencies().get("tomcat-runtime");
124+
assertThat(dependency.getGroupId()).isEqualTo("org.springframework.boot");
125+
assertThat(dependency.getArtifactId()).isEqualTo("spring-boot-starter-tomcat-runtime");
126+
assertThat(dependency.getScope()).isEqualTo(DependencyScope.PROVIDED_RUNTIME);
127+
}
128+
129+
private Build createGradleBuild(InitializrMetadata metadata, String bootVersion) {
130+
Version version = Version.parse(bootVersion);
131+
this.projectDescription.setPlatformVersion(version);
132+
return new GradleBuild(new MetadataBuildItemResolver(metadata, version));
135133
}
136134

137135
private Build createBuild(InitializrMetadata metadata) {

0 commit comments

Comments
 (0)