Skip to content

Commit a04b9a5

Browse files
yonatankarpclaude
andauthored
feat(kotlin-spring): add Spring Boot 4 and Jackson 3 support (#23154)
* feat(kotlin): add Jackson 3 infrastructure to AbstractKotlinCodegen * feat(kotlin-spring): add useSpringBoot4 and useJackson3 flags * feat(kotlin-spring): update template selection for Spring Boot 4 * feat(kotlin-spring): add SB4 templates for all libraries * test(kotlin-spring): add tests for Spring Boot 4 and Jackson 3 support * feat(kotlin-spring): add kotlin-springboot-4 sample with Jackson 3 * docs(kotlin-spring): document useSpringBoot4 and useJackson3 options * fix(kotlin-spring): update Gradle templates to Kotlin 2.2 JvmTarget DSL and bump CI Gradle - Replace deprecated kotlinOptions.jvmTarget with kotlin.compilerOptions DSL - Upgrade Gradle wrapper to 8.14 for Kotlin 2.2 compatibility - Add kotlin-springboot-4 sample to JDK17 CI matrix - Regenerate sample with updated templates * fix(kotlin-spring): register useJackson3 CLI option and use Gradle 8.14 for SB4 - Add addSwitch for useJackson3 in KotlinSpringServerCodegen so it appears in auto-generated docs - Update gradle-wrapper.properties.mustache templates to use Gradle 8.14 when useSpringBoot4 is enabled (required minimum for Spring Boot 4) * fix(kotlin-client): fix Jackson 3 package imports and add ktor/spring-restclient support Replace hardcoded com.fasterxml.jackson imports with {{jacksonPackage}} template variable across all kotlin-client templates so generated code compiles correctly when useJackson3=true. Also fix trailing space in OAuth Bearer header, enable useJackson3 for jvm-ktor (Ktor 3.4.0) and jvm-spring-restclient (Spring Boot 4), and add conditional Jackson 3 dependencies in build.gradle. * Revert "fix(kotlin-client): fix Jackson 3 package imports and add ktor/spring-restclient support" Block useJackson3 for kotlin-client with a clear error until client template support is added in a follow-up PR. * ci: retrigger CI checks * fix(kotlin-spring): replace legacy oauth2 starter and add Jackson exclusivity tests Replace deprecated spring-cloud-starter-oauth2:2.2.5.RELEASE with spring-boot-starter-oauth2-client in SB4 templates, as the legacy starter is pre-Jakarta and incompatible with Spring Boot 4. Add negative assertions to Jackson dependency tests to ensure Jackson 2 and Jackson 3 artifacts are mutually exclusive. * feat(kotlin-spring): default to Jackson 3 when Spring Boot 4 is enabled Spring Boot 4 ships with Jackson 3 out of the box, so useJackson3 now defaults to true when useSpringBoot4 is enabled and the user hasn't explicitly set useJackson3. * fix(kotlin-spring): declare springdoc version property regardless of useSwaggerUI The springdoc-openapi.version Maven property was only declared when useSwaggerUI=true, but the springdoc core dependency (used when useSwaggerUI=false) also references it, causing an undefined property. * fix(kotlin-spring): use modern OAuth2 client config for Spring Boot 4 spring-cloud library Add useSpringBoot4 conditionals to clientConfiguration.mustache so SB4 uses OAuth2AuthorizedClientManager instead of legacy OAuth2FeignRequestInterceptor and *ResourceDetails classes that don't exist in Spring Boot 4. * fix(kotlin-spring): default Jackson 3 when Spring Boot 4 set via setter or additionalProperties The Jackson 3 defaulting logic only checked additionalProperties map, so calling setUseSpringBoot4(true) via the Java API skipped the default. Now checks both the field value and the map. * fix(kotlin-spring): add trailing newline to clientConfiguration template * Trigger CI * clean up conditions * fix(kotlin-spring): remove SB4+Jackson2 test since SB4 unconditionally implies Jackson 3 Spring Boot 4 ships with Jackson 3 — there is no supported SB4+Jackson2 combination, so the test was asserting an invalid scenario. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 1462933 commit a04b9a5

52 files changed

Lines changed: 3382 additions & 17 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/samples-kotlin-server-jdk17.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ on:
2727
# - samples/server/petstore/kotlin-spring-default/**
2828

2929
env:
30-
GRADLE_VERSION: '8.11'
30+
GRADLE_VERSION: '8.14'
3131

3232
jobs:
3333
build:
@@ -48,6 +48,7 @@ jobs:
4848
- samples/server/petstore/kotlin-springboot-additionalproperties
4949
- samples/server/petstore/kotlin-springboot-delegate-nodefaults
5050
- samples/server/petstore/kotlin-springboot-request-cookie
51+
- samples/server/petstore/kotlin-springboot-4
5152
- samples/server/petstore/kotlin-server/jaxrs-spec
5253
- samples/server/petstore/kotlin-server/jaxrs-spec-mutiny
5354
- samples/server/petstore/kotlin-server/javalin

.github/workflows/samples-kotlin-server-jdk21.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ on:
1313
- 'samples/server/petstore/kotlin-server-required-and-nullable-properties/**'
1414

1515
env:
16-
GRADLE_VERSION: '8.11'
16+
GRADLE_VERSION: '8.14'
1717

1818
jobs:
1919
build:
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
generatorName: kotlin-spring
2+
outputDir: samples/server/petstore/kotlin-springboot-4
3+
library: spring-boot
4+
inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml
5+
templateDir: modules/openapi-generator/src/main/resources/kotlin-spring
6+
additionalProperties:
7+
documentationProvider: none
8+
annotationLibrary: none
9+
useSwaggerUI: "false"
10+
serviceImplementation: "true"
11+
serializableModel: "true"
12+
beanValidations: "true"
13+
useSpringBoot4: "true"
14+
useJackson3: "true"
15+
requestMappingMode: api_interface
16+
gradleBuildFile: "true"

docs/generators/kotlin-spring.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ These options may be applied as additional-properties (cli) or configOptions (pl
5959
|useBeanValidation|Use BeanValidation API annotations to validate data types| |true|
6060
|useFeignClientUrl|Whether to generate Feign client with url parameter.| |true|
6161
|useFlowForArrayReturnType|Whether to use Flow for array/collection return types when reactive is enabled. If false, will use List instead.| |true|
62+
|useJackson3|Use Jackson 3 dependencies (tools.jackson package). Only available with `useSpringBoot4`. Defaults to true when `useSpringBoot4` is enabled. Incompatible with `openApiNullable`.| |false|
6263
|useResponseEntity|Whether (when false) to return actual type (e.g. List&lt;Fruit&gt;) and handle non-happy path responses via exceptions flow or (when true) return entire ResponseEntity (e.g. ResponseEntity&lt;List&lt;Fruit&gt;&gt;). If disabled, method are annotated using a @ResponseStatus annotation, which has the status of the first response declared in the Api definition| |true|
6364
|useSealedResponseInterfaces|Generate sealed interfaces for endpoint responses that all possible response types implement. Allows controllers to return any valid response type in a type-safe manner (e.g., sealed interface CreateUserResponse implemented by User, ConflictResponse, ErrorResponse)| |false|
6465
|useSpringBoot3|Generate code and provide dependencies for use with Spring Boot &ge; 3 (use jakarta instead of javax in imports). Enabling this option will also enable `useJakartaEe`.| |false|
66+
|useSpringBoot4|Generate code and provide dependencies for use with Spring Boot 4.x. Enabling this option will also enable `useJakartaEe`.| |false|
6567
|useSwaggerUI|Open the OpenApi specification in swagger-ui. Will also import and configure needed dependencies| |true|
6668
|useTags|Whether to use tags for creating interface and controller class names| |false|
6769
|xKotlinImplementsFieldsSkip|A list of fields per schema name that should NOT be created with `override` keyword despite their presence in vendor extension `x-kotlin-implements-fields` for the schema. Example: yaml `xKotlinImplementsFieldsSkip: Pet: [photoUrls]` skips `override` for `photoUrls` in schema `Pet`| |empty map|

docs/generators/kotlin.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
5050
|sourceFolder|source folder for generated code| |src/main/kotlin|
5151
|supportAndroidApiLevel25AndBelow|[WARNING] This flag will generate code that has a known security vulnerability. It uses `kotlin.io.createTempFile` instead of `java.nio.file.Files.createTempFile` in order to support Android API level 25 and below. For more info, please check the following links https://github.com/OpenAPITools/openapi-generator/security/advisories/GHSA-23x4-m842-fmwf, https://github.com/OpenAPITools/openapi-generator/pull/9284| |false|
5252
|useCoroutines|Whether to use the Coroutines adapter with the retrofit2 library.| |false|
53+
|useJackson3|Use Jackson 3 dependencies (tools.jackson package). Not yet supported for kotlin-client; reserved for future use.| |false|
5354
|useNonAsciiHeaders|Allow to use non-ascii headers with the okhttp library| |false|
5455
|useResponseAsReturnType|When using retrofit2 and coroutines, use `Response`&lt;`T`&gt; as return type instead of `T`.| |true|
5556
|useRxJava3|Whether to use the RxJava3 adapter with the retrofit2 library.| |false|

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co
5656

5757
public static final String JAVAX_PACKAGE = "javaxPackage";
5858
public static final String USE_JAKARTA_EE = "useJakartaEe";
59+
public static final String USE_JACKSON_3 = "useJackson3";
60+
public static final String JACKSON2_PACKAGE = "com.fasterxml.jackson";
61+
public static final String JACKSON3_PACKAGE = "tools.jackson";
62+
public static final String JACKSON_PACKAGE = "jacksonPackage";
5963
public static final String SCHEMA_IMPLEMENTS = "schemaImplements";
6064
public static final String SCHEMA_IMPLEMENTS_FIELDS = "schemaImplementsFields";
6165
public static final String X_KOTLIN_IMPLEMENTS_SKIP = "xKotlinImplementsSkip";
@@ -80,6 +84,7 @@ public abstract class AbstractKotlinCodegen extends DefaultCodegen implements Co
8084
protected boolean serializableModel = false;
8185

8286
@Setter protected boolean useJakartaEe = false;
87+
@Getter @Setter protected boolean useJackson3 = false;
8388

8489
@Setter protected boolean nonPublicApi = false;
8590

@@ -569,6 +574,17 @@ public void processOpts() {
569574
} else {
570575
applyJavaxPackage();
571576
}
577+
578+
if (additionalProperties.containsKey(USE_JACKSON_3)) {
579+
setUseJackson3(Boolean.parseBoolean(additionalProperties.get(USE_JACKSON_3).toString()));
580+
}
581+
additionalProperties.put(USE_JACKSON_3, useJackson3);
582+
583+
if (useJackson3) {
584+
applyJackson3Package();
585+
} else {
586+
applyJackson2Package();
587+
}
572588
}
573589

574590
protected boolean isModelMutable() {
@@ -844,6 +860,14 @@ protected void applyJakartaPackage() {
844860
writePropertyBack(JAVAX_PACKAGE, "jakarta");
845861
}
846862

863+
protected void applyJackson2Package() {
864+
writePropertyBack(JACKSON_PACKAGE, JACKSON2_PACKAGE);
865+
}
866+
867+
protected void applyJackson3Package() {
868+
writePropertyBack(JACKSON_PACKAGE, JACKSON3_PACKAGE);
869+
}
870+
847871
@Override
848872
protected boolean isReservedWord(String word) {
849873
// We want case-sensitive escaping, to avoid unnecessary backtick-escaping.

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinClientCodegen.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,9 @@ public KotlinClientCodegen() {
298298

299299
cliOptions.add(CliOption.newBoolean(USE_NON_ASCII_HEADERS, "Allow to use non-ascii headers with the okhttp library"));
300300
cliOptions.add(CliOption.newBoolean(USE_RESPONSE_AS_RETURN_TYPE, "When using retrofit2 and coroutines, use `Response`<`T`> as return type instead of `T`.", true));
301+
302+
cliOptions.add(CliOption.newBoolean(USE_JACKSON_3,
303+
"Use Jackson 3 dependencies (tools.jackson package). Not yet supported for kotlin-client; reserved for future use."));
301304
}
302305

303306
@Override
@@ -466,6 +469,11 @@ public void processOpts() {
466469
convertPropertyToBooleanAndWriteBack(USE_SPRING_BOOT3);
467470
}
468471

472+
if (isUseJackson3()) {
473+
throw new IllegalArgumentException(
474+
"useJackson3 is not yet supported for kotlin-client. Jackson 3 support for kotlin-client will be added in a future release.");
475+
}
476+
469477
if (additionalProperties.containsKey(CodegenConstants.SERIALIZATION_LIBRARY)) {
470478
setSerializationLibrary((String) additionalProperties.get(CodegenConstants.SERIALIZATION_LIBRARY));
471479
additionalProperties.put(this.serializationLibrary.name(), true);

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ public class KotlinSpringServerCodegen extends AbstractKotlinCodegen
9191
public static final String DECLARATIVE_INTERFACE_REACTIVE_MODE = "declarativeInterfaceReactiveMode";
9292

9393
public static final String USE_SPRING_BOOT3 = "useSpringBoot3";
94+
public static final String USE_SPRING_BOOT4 = "useSpringBoot4";
9495
public static final String INCLUDE_HTTP_REQUEST_CONTEXT = "includeHttpRequestContext";
9596
public static final String USE_FLOW_FOR_ARRAY_RETURN_TYPE = "useFlowForArrayReturnType";
9697
public static final String REQUEST_MAPPING_OPTION = "requestMappingMode";
@@ -168,6 +169,8 @@ public String getDescription() {
168169

169170
@Getter @Setter
170171
protected boolean useSpringBoot3 = false;
172+
@Getter @Setter
173+
protected boolean useSpringBoot4 = false;
171174
protected RequestMappingMode requestMappingMode = RequestMappingMode.controller;
172175
private DocumentationProvider documentationProvider;
173176
private AnnotationLibrary annotationLibrary;
@@ -254,6 +257,8 @@ public KotlinSpringServerCodegen() {
254257
"@RestController annotations. May be used to prevent bean names clash if multiple generated libraries" +
255258
" (contexts) added to single project.", beanQualifiers);
256259
addSwitch(USE_SPRING_BOOT3, "Generate code and provide dependencies for use with Spring Boot ≥ 3 (use jakarta instead of javax in imports). Enabling this option will also enable `useJakartaEe`.", useSpringBoot3);
260+
addSwitch(USE_SPRING_BOOT4, "Generate code and provide dependencies for use with Spring Boot 4.x. Enabling this option will also enable `useJakartaEe`.", useSpringBoot4);
261+
addSwitch(USE_JACKSON_3, "Use Jackson 3 dependencies (tools.jackson package). Only available with `useSpringBoot4`. Defaults to true when `useSpringBoot4` is enabled. Incompatible with `openApiNullable`.", useJackson3);
257262
addSwitch(USE_FLOW_FOR_ARRAY_RETURN_TYPE, "Whether to use Flow for array/collection return types when reactive is enabled. If false, will use List instead.", useFlowForArrayReturnType);
258263
addSwitch(INCLUDE_HTTP_REQUEST_CONTEXT, "Whether to include HttpServletRequest (blocking) or ServerWebExchange (reactive) as additional parameter in generated methods.", includeHttpRequestContext);
259264
addSwitch(USE_RESPONSE_ENTITY,
@@ -419,6 +424,13 @@ public String getHelp() {
419424

420425
@Override
421426
public void processOpts() {
427+
boolean springBoot4Enabled = useSpringBoot4
428+
|| (additionalProperties.containsKey(USE_SPRING_BOOT4)
429+
&& convertPropertyToBoolean(USE_SPRING_BOOT4));
430+
if (springBoot4Enabled) {
431+
additionalProperties.put(USE_JACKSON_3, "true");
432+
}
433+
422434
super.processOpts();
423435

424436
if (DocumentationProvider.SPRINGFOX.equals(getDocumentationProvider())) {
@@ -467,6 +479,9 @@ public void processOpts() {
467479
if (additionalProperties.containsKey(USE_SPRING_BOOT3)) {
468480
this.setUseSpringBoot3(convertPropertyToBoolean(USE_SPRING_BOOT3));
469481
}
482+
if (additionalProperties.containsKey(USE_SPRING_BOOT4)) {
483+
this.setUseSpringBoot4(convertPropertyToBoolean(USE_SPRING_BOOT4));
484+
}
470485
if (additionalProperties.containsKey(INCLUDE_HTTP_REQUEST_CONTEXT)) {
471486
this.setIncludeHttpRequestContext(convertPropertyToBoolean(INCLUDE_HTTP_REQUEST_CONTEXT));
472487
}
@@ -493,6 +508,11 @@ public void processOpts() {
493508
// used later in recursive import in postProcessingModels
494509
importMapping.put("com.fasterxml.jackson.annotation.JsonProperty", "com.fasterxml.jackson.annotation.JsonCreator");
495510

511+
if (isUseJackson3()) {
512+
// Override databind imports for Jackson 3
513+
importMapping.put("JsonDeserialize", "tools.jackson.databind.annotation.JsonDeserialize");
514+
}
515+
496516
// Spring-specific import mappings for x-spring-paginated support
497517
importMapping.put("ApiIgnore", "springfox.documentation.annotations.ApiIgnore");
498518
importMapping.put("ParameterObject", "org.springdoc.api.annotations.ParameterObject");
@@ -634,7 +654,9 @@ public void processOpts() {
634654
}
635655
}
636656
if (SPRING_DECLARATIVE_HTTP_INTERFACE_LIBRARY.equals(library)) {
637-
this.setUseSpringBoot3(true);
657+
if (!isUseSpringBoot4()) {
658+
this.setUseSpringBoot3(true);
659+
}
638660
this.setInterfaceOnly(true);
639661
this.setUseFeignClient(false);
640662
this.setSkipDefaultInterface(true);
@@ -689,7 +711,20 @@ public void processOpts() {
689711
this.setAutoXSpringPaginated(convertPropertyToBoolean(AUTO_X_SPRING_PAGINATED));
690712
}
691713
writePropertyBack(AUTO_X_SPRING_PAGINATED, autoXSpringPaginated);
692-
if (isUseSpringBoot3()) {
714+
if (isUseSpringBoot3() && isUseSpringBoot4()) {
715+
throw new IllegalArgumentException("Choose between Spring Boot 3 and Spring Boot 4");
716+
}
717+
718+
if (isUseJackson3() && !isUseSpringBoot4()) {
719+
throw new IllegalArgumentException("useJackson3 is only available with Spring Boot >= 4");
720+
}
721+
722+
if (isUseJackson3() && additionalProperties.containsKey("openApiNullable")
723+
&& Boolean.parseBoolean(additionalProperties.get("openApiNullable").toString())) {
724+
throw new IllegalArgumentException("openApiNullable cannot be set with useJackson3");
725+
}
726+
727+
if (isUseSpringBoot3() || isUseSpringBoot4()) {
693728
if (DocumentationProvider.SPRINGFOX.equals(getDocumentationProvider())) {
694729
throw new IllegalArgumentException(DocumentationProvider.SPRINGFOX.getPropertyName() + " is not supported with Spring Boot > 3.x");
695730
}
@@ -701,6 +736,7 @@ public void processOpts() {
701736
applyJakartaPackage();
702737
}
703738
writePropertyBack(USE_SPRING_BOOT3, isUseSpringBoot3());
739+
writePropertyBack(USE_SPRING_BOOT4, isUseSpringBoot4());
704740

705741
modelTemplateFiles.put("model.mustache", ".kt");
706742

@@ -742,14 +778,18 @@ public void processOpts() {
742778
supportingFiles.add(new SupportingFile("apiUtil.mustache",
743779
(sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiUtil.kt"));
744780

745-
if (isUseSpringBoot3()) {
781+
if (isUseSpringBoot4()) {
782+
supportingFiles.add(new SupportingFile("pom-sb4.mustache", "", "pom.xml"));
783+
} else if (isUseSpringBoot3()) {
746784
supportingFiles.add(new SupportingFile("pom-sb3.mustache", "", "pom.xml"));
747785
} else {
748786
supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml"));
749787
}
750788

751789
if (this.gradleBuildFile) {
752-
if (isUseSpringBoot3()) {
790+
if (isUseSpringBoot4()) {
791+
supportingFiles.add(new SupportingFile("buildGradle-sb4-Kts.mustache", "", "build.gradle.kts"));
792+
} else if (isUseSpringBoot3()) {
753793
supportingFiles.add(new SupportingFile("buildGradle-sb3-Kts.mustache", "", "build.gradle.kts"));
754794
} else {
755795
supportingFiles.add(new SupportingFile("buildGradleKts.mustache", "", "build.gradle.kts"));
@@ -788,14 +828,18 @@ public void processOpts() {
788828
if (library.equals(SPRING_CLOUD_LIBRARY)) {
789829
LOGGER.info("Setup code generator for Kotlin Spring Cloud Client");
790830

791-
if (isUseSpringBoot3()) {
831+
if (isUseSpringBoot4()) {
832+
supportingFiles.add(new SupportingFile("pom-sb4.mustache", "pom.xml"));
833+
} else if (isUseSpringBoot3()) {
792834
supportingFiles.add(new SupportingFile("pom-sb3.mustache", "pom.xml"));
793835
} else {
794836
supportingFiles.add(new SupportingFile("pom.mustache", "pom.xml"));
795837
}
796838

797839
if (this.gradleBuildFile) {
798-
if (isUseSpringBoot3()) {
840+
if (isUseSpringBoot4()) {
841+
supportingFiles.add(new SupportingFile("buildGradle-sb4-Kts.mustache", "build.gradle.kts"));
842+
} else if (isUseSpringBoot3()) {
799843
supportingFiles.add(new SupportingFile("buildGradle-sb3-Kts.mustache", "build.gradle.kts"));
800844
} else {
801845
supportingFiles.add(new SupportingFile("buildGradleKts.mustache", "build.gradle.kts"));
@@ -827,10 +871,18 @@ public void processOpts() {
827871
if (library.equals(SPRING_DECLARATIVE_HTTP_INTERFACE_LIBRARY)) {
828872
LOGGER.info("Setup code generator for Kotlin Spring Declarative Http interface");
829873

830-
supportingFiles.add(new SupportingFile("pom-sb3.mustache", "pom.xml"));
874+
if (isUseSpringBoot4()) {
875+
supportingFiles.add(new SupportingFile("pom-sb4.mustache", "pom.xml"));
876+
} else {
877+
supportingFiles.add(new SupportingFile("pom-sb3.mustache", "pom.xml"));
878+
}
831879

832880
if (this.gradleBuildFile) {
833-
supportingFiles.add(new SupportingFile("buildGradle-sb3-Kts.mustache", "build.gradle.kts"));
881+
if (isUseSpringBoot4()) {
882+
supportingFiles.add(new SupportingFile("buildGradle-sb4-Kts.mustache", "build.gradle.kts"));
883+
} else {
884+
supportingFiles.add(new SupportingFile("buildGradle-sb3-Kts.mustache", "build.gradle.kts"));
885+
}
834886
supportingFiles.add(new SupportingFile("settingsGradle.mustache", "settings.gradle"));
835887

836888
String gradleWrapperPackage = "gradle.wrapper";

0 commit comments

Comments
 (0)