diff --git a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java index c89fedd6..c2c31156 100644 --- a/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java +++ b/initializr-generator/src/main/java/io/spring/initializr/generator/ProjectGenerator.java @@ -80,6 +80,8 @@ public class ProjectGenerator { private static final Version VERSION_2_0_0_M3 = Version.parse("2.0.0.M3"); + private static final Version VERSION_2_0_0_M6 = Version.parse("2.0.0.M6"); + @Autowired private ApplicationEventPublisher eventPublisher; @@ -344,7 +346,16 @@ public class ProjectGenerator { model.put("war", true); } + // Kotlin supported as of M6 + final boolean kotlinSupport = VERSION_2_0_0_M6 + .compareTo(Version.safeParse(request.getBootVersion())) <= 0; + model.put("kotlinSupport", kotlinSupport); + if (isMavenBuild(request)) { + if (kotlinSupport) { // No need to provide a kotlin.version + request.getBuildProperties().getVersions() + .remove(new VersionProperty("kotlin.version")); + } model.put("mavenBuild", true); ParentPom parentPom = metadata.getConfiguration().getEnv().getMaven() .resolveParentPom(request.getBootVersion()); @@ -433,8 +444,8 @@ public class ProjectGenerator { model.put("newTestInfrastructure", isNewTestInfrastructureAvailable(request)); // Servlet Initializer - model.put("servletInitializrImport", generateImport(getServletInitializrClass(request), - request.getLanguage())); + model.put("servletInitializrImport", new Imports(request.getLanguage()).add( + getServletInitializrClass(request)).toString()); // Java versions model.put("isJava6", isJavaVersion(request, "1.6")); @@ -538,17 +549,6 @@ public class ProjectGenerator { } } - protected String addImport(String type, String language) { - return String.format("%s%n", generateImport(type, language)); - } - - protected String generateImport(String type, String language) { - String end = ("groovy".equals(language) || "kotlin".equals(language)) ? "" : ";"; - return "import " + type + end; - } - - - private static boolean isGradleBuild(ProjectRequest request) { return "gradle".equals(request.getBuild()); } diff --git a/initializr-generator/src/main/resources/templates/Application.kt b/initializr-generator/src/main/resources/templates/Application.kt index 9c5a0ce1..a1ab7857 100644 --- a/initializr-generator/src/main/resources/templates/Application.kt +++ b/initializr-generator/src/main/resources/templates/Application.kt @@ -1,11 +1,21 @@ package {{packageName}} +{{^kotlinSupport}} import org.springframework.boot.SpringApplication +{{/kotlinSupport}} {{applicationImports}} +{{#kotlinSupport}} +import org.springframework.boot.runApplication +{{/kotlinSupport}} {{applicationAnnotations}} class {{applicationName}} fun main(args: Array) { +{{^kotlinSupport}} SpringApplication.run({{applicationName}}::class.java, *args) +{{/kotlinSupport}} +{{#kotlinSupport}} + runApplication<{{applicationName}}>(*args) +{{/kotlinSupport}} } diff --git a/initializr-generator/src/main/resources/templates/starter-build.gradle b/initializr-generator/src/main/resources/templates/starter-build.gradle index 73602099..f374058d 100644 --- a/initializr-generator/src/main/resources/templates/starter-build.gradle +++ b/initializr-generator/src/main/resources/templates/starter-build.gradle @@ -87,12 +87,12 @@ dependencies { compile("org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}") {{/isJava6}} {{#isJava7}} - compile("org.jetbrains.kotlin:kotlin-stdlib-jre7:${kotlinVersion}") + compile("org.jetbrains.kotlin:kotlin-stdlib-jre7{{^kotlinSupport}}:${kotlinVersion}{{/kotlinSupport}}") {{/isJava7}} {{#isJava8}} - compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}") + compile("org.jetbrains.kotlin:kotlin-stdlib-jre8{{^kotlinSupport}}:${kotlinVersion}{{/kotlinSupport}}") {{/isJava8}} - compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") + compile("org.jetbrains.kotlin:kotlin-reflect{{^kotlinSupport}}:${kotlinVersion}{{/kotlinSupport}}") {{/kotlin}} {{#runtimeDependencies}} runtime('{{groupId}}:{{artifactId}}{{#version}}:{{version}}{{/version}}{{#type}}@{{type}}{{/type}}') diff --git a/initializr-generator/src/main/resources/templates/starter-pom.xml b/initializr-generator/src/main/resources/templates/starter-pom.xml index 25576ad2..331e8951 100644 --- a/initializr-generator/src/main/resources/templates/starter-pom.xml +++ b/initializr-generator/src/main/resources/templates/starter-pom.xml @@ -58,12 +58,16 @@ {{#isJava8}} kotlin-stdlib-jre8 {{/isJava8}} + {{^kotlinSupport}} ${kotlin.version} + {{/kotlinSupport}} org.jetbrains.kotlin kotlin-reflect + {{^kotlinSupport}} ${kotlin.version} + {{/kotlinSupport}} {{/kotlin}} @@ -177,15 +181,20 @@ kotlin-maven-plugin org.jetbrains.kotlin + {{^kotlinSupport}} ${kotlin.version} + {{/kotlinSupport}} spring + {{^kotlinSupport}} {{#isJava8}} 1.8 {{/isJava8}} + {{/kotlinSupport}} + {{^kotlinSupport}} compile @@ -202,6 +211,7 @@ + {{/kotlinSupport}} org.jetbrains.kotlin diff --git a/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorBuildTests.java b/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorBuildTests.java index 9a4047bd..6eb19b1e 100644 --- a/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorBuildTests.java +++ b/initializr-generator/src/test/java/io/spring/initializr/generator/ProjectGeneratorBuildTests.java @@ -191,6 +191,30 @@ public class ProjectGeneratorBuildTests extends AbstractProjectGeneratorTests { "project/" + build + "/kotlin-java7-" + assertFileName)); } + @Test + public void kotlinSpringBoot2Legacy() { + ProjectRequest request = createProjectRequest(); + request.setLanguage("kotlin"); + request.setBootVersion("2.0.0.M5"); + ProjectAssert project = generateProject(request); + project.sourceCodeAssert("src/main/kotlin/com/example/demo/DemoApplication.kt") + .equalsTo(new ClassPathResource("project/kotlin/spring-boot-2.0/DemoApplicationLegacy.kt.gen")); + project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource( + "project/" + build + "/kotlin-springboot2-legacy-" + assertFileName)); + } + + @Test + public void kotlinSpringBoot2() { + ProjectRequest request = createProjectRequest(); + request.setLanguage("kotlin"); + request.setBootVersion("2.0.0.M6"); + ProjectAssert project = generateProject(request); + project.sourceCodeAssert("src/main/kotlin/com/example/demo/DemoApplication.kt") + .equalsTo(new ClassPathResource("project/kotlin/spring-boot-2.0/DemoApplication.kt.gen")); + project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource( + "project/" + build + "/kotlin-springboot2-" + assertFileName)); + } + @Override public ProjectRequest createProjectRequest(String... styles) { ProjectRequest request = super.createProjectRequest(styles); diff --git a/initializr-generator/src/test/resources/project/gradle/kotlin-springboot2-build.gradle.gen b/initializr-generator/src/test/resources/project/gradle/kotlin-springboot2-build.gradle.gen new file mode 100644 index 00000000..3f9fe445 --- /dev/null +++ b/initializr-generator/src/test/resources/project/gradle/kotlin-springboot2-build.gradle.gen @@ -0,0 +1,46 @@ +buildscript { + ext { + kotlinVersion = '1.1.1' + springBootVersion = '2.0.0.M6' + } + repositories { + mavenCentral() + maven { url "https://repo.spring.io/snapshot" } + maven { url "https://repo.spring.io/milestone" } + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}") + classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}") + } +} + +apply plugin: 'kotlin' +apply plugin: 'kotlin-spring' +apply plugin: 'eclipse' +apply plugin: 'org.springframework.boot' +apply plugin: 'io.spring.dependency-management' + +group = 'com.example' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = 1.8 +compileKotlin { + kotlinOptions.jvmTarget = "1.8" +} +compileTestKotlin { + kotlinOptions.jvmTarget = "1.8" +} + +repositories { + mavenCentral() + maven { url "https://repo.spring.io/snapshot" } + maven { url "https://repo.spring.io/milestone" } +} + + +dependencies { + compile('org.springframework.boot:spring-boot-starter') + compile("org.jetbrains.kotlin:kotlin-stdlib-jre8") + compile("org.jetbrains.kotlin:kotlin-reflect") + testCompile('org.springframework.boot:spring-boot-starter-test') +} diff --git a/initializr-generator/src/test/resources/project/gradle/kotlin-springboot2-legacy-build.gradle.gen b/initializr-generator/src/test/resources/project/gradle/kotlin-springboot2-legacy-build.gradle.gen new file mode 100644 index 00000000..46ed2e86 --- /dev/null +++ b/initializr-generator/src/test/resources/project/gradle/kotlin-springboot2-legacy-build.gradle.gen @@ -0,0 +1,46 @@ +buildscript { + ext { + kotlinVersion = '1.1.1' + springBootVersion = '2.0.0.M5' + } + repositories { + mavenCentral() + maven { url "https://repo.spring.io/snapshot" } + maven { url "https://repo.spring.io/milestone" } + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}") + classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}") + } +} + +apply plugin: 'kotlin' +apply plugin: 'kotlin-spring' +apply plugin: 'eclipse' +apply plugin: 'org.springframework.boot' +apply plugin: 'io.spring.dependency-management' + +group = 'com.example' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = 1.8 +compileKotlin { + kotlinOptions.jvmTarget = "1.8" +} +compileTestKotlin { + kotlinOptions.jvmTarget = "1.8" +} + +repositories { + mavenCentral() + maven { url "https://repo.spring.io/snapshot" } + maven { url "https://repo.spring.io/milestone" } +} + + +dependencies { + compile('org.springframework.boot:spring-boot-starter') + compile("org.jetbrains.kotlin:kotlin-stdlib-jre8:${kotlinVersion}") + compile("org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}") + testCompile('org.springframework.boot:spring-boot-starter-test') +} diff --git a/initializr-generator/src/test/resources/project/kotlin/spring-boot-2.0/DemoApplication.kt.gen b/initializr-generator/src/test/resources/project/kotlin/spring-boot-2.0/DemoApplication.kt.gen new file mode 100644 index 00000000..9595baaf --- /dev/null +++ b/initializr-generator/src/test/resources/project/kotlin/spring-boot-2.0/DemoApplication.kt.gen @@ -0,0 +1,11 @@ +package com.example.demo + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class DemoApplication + +fun main(args: Array) { + runApplication(*args) +} diff --git a/initializr-generator/src/test/resources/project/kotlin/spring-boot-2.0/DemoApplicationLegacy.kt.gen b/initializr-generator/src/test/resources/project/kotlin/spring-boot-2.0/DemoApplicationLegacy.kt.gen new file mode 100644 index 00000000..8100bf90 --- /dev/null +++ b/initializr-generator/src/test/resources/project/kotlin/spring-boot-2.0/DemoApplicationLegacy.kt.gen @@ -0,0 +1,11 @@ +package com.example.demo + +import org.springframework.boot.SpringApplication +import org.springframework.boot.autoconfigure.SpringBootApplication + +@SpringBootApplication +class DemoApplication + +fun main(args: Array) { + SpringApplication.run(DemoApplication::class.java, *args) +} diff --git a/initializr-generator/src/test/resources/project/maven/kotlin-springboot2-legacy-pom.xml.gen b/initializr-generator/src/test/resources/project/maven/kotlin-springboot2-legacy-pom.xml.gen new file mode 100644 index 00000000..621544ee --- /dev/null +++ b/initializr-generator/src/test/resources/project/maven/kotlin-springboot2-legacy-pom.xml.gen @@ -0,0 +1,136 @@ + + + 4.0.0 + + com.example + demo + 0.0.1-SNAPSHOT + jar + + demo + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.M5 + + + + + true + UTF-8 + UTF-8 + 1.8 + 1.1.1 + + + + + org.springframework.boot + spring-boot-starter + + + org.jetbrains.kotlin + kotlin-stdlib-jre8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 1.8 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + diff --git a/initializr-generator/src/test/resources/project/maven/kotlin-springboot2-pom.xml.gen b/initializr-generator/src/test/resources/project/maven/kotlin-springboot2-pom.xml.gen new file mode 100644 index 00000000..bfae32b7 --- /dev/null +++ b/initializr-generator/src/test/resources/project/maven/kotlin-springboot2-pom.xml.gen @@ -0,0 +1,115 @@ + + + 4.0.0 + + com.example + demo + 0.0.1-SNAPSHOT + jar + + demo + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.M6 + + + + + true + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + org.jetbrains.kotlin + kotlin-stdlib-jre8 + + + org.jetbrains.kotlin + kotlin-reflect + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + kotlin-maven-plugin + org.jetbrains.kotlin + + + spring + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/snapshot + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + false + + + + + +