Set kotlin.version when Kotlin's Gradle plugin is applied

Closes gh-11711
This commit is contained in:
Andy Wilkinson 2018-01-29 10:13:12 +00:00
parent bdd532cc20
commit 199088b0c9
8 changed files with 194 additions and 6 deletions

View File

@ -29,6 +29,12 @@
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId> <artifactId>commons-compress</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-gradle-plugin</artifactId>
<version>${kotlin.version}</version>
<optional>true</optional>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>

View File

@ -4,6 +4,8 @@
When another plugin is applied the Spring Boot plugin reacts by making various changes When another plugin is applied the Spring Boot plugin reacts by making various changes
to the project's configuration. This section describes those changes. to the project's configuration. This section describes those changes.
[[reacting-to-other-plugins-java]] [[reacting-to-other-plugins-java]]
=== Reacting to the Java plugin === Reacting to the Java plugin
@ -25,6 +27,18 @@ plugin:
[[reacting-to-other-plugins-kotlin]]
=== Reacting to the Kotlin plugin
When {kotlin-plugin}[Kotlin's Gradle plugin] is applied to a project, the Spring Boot
plugin:
1. Aligns the Koltin version used in Spring Boot's dependency management with the version
of the plugin. This is achieved by setting the `kotlin.version` property with a value
that matches the version of the Kotlin plugin.
[[reacting-to-other-plugins-war]] [[reacting-to-other-plugins-war]]
=== Reacting to the war plugin === Reacting to the war plugin

View File

@ -0,0 +1,56 @@
/*
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.gradle.plugin;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.plugins.ExtraPropertiesExtension;
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper;
/**
* {@link PluginApplicationAction} that reacts to Kotlin's Gradle plugin being applied by
* configuring a {@code kotlin.version} property to align the version used for dependency
* management for Kotlin with the version of its plugin.
*
* @author Andy Wilkinson
*/
class KotlinPluginAction implements PluginApplicationAction {
@Override
public void execute(Project project) {
String kotlinVersion = project.getPlugins().getPlugin(KotlinPluginWrapper.class)
.getKotlinPluginVersion();
ExtraPropertiesExtension extraProperties = project.getExtensions()
.getExtraProperties();
if (!extraProperties.has("kotlin.version")) {
extraProperties.set("kotlin.version", kotlinVersion);
}
}
@Override
@SuppressWarnings("unchecked")
public Class<? extends Plugin<? extends Project>> getPluginClass() {
try {
return (Class<? extends Plugin<? extends Project>>) Class
.forName("org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper");
}
catch (Throwable ex) {
return null;
}
}
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2017 the original author or authors. * Copyright 2012-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -30,9 +30,9 @@ interface PluginApplicationAction extends Action<Project> {
/** /**
* The class of the {@code Plugin} that, when applied, will trigger the execution of * The class of the {@code Plugin} that, when applied, will trigger the execution of
* this action. * this action. May return {@code null} if the plugin class is not on the classpath.
* *
* @return the plugin class * @return the plugin class or {@code null}
*/ */
Class<? extends Plugin<? extends Project>> getPluginClass(); Class<? extends Plugin<? extends Project>> getPluginClass();

View File

@ -108,10 +108,15 @@ public class SpringBootPlugin implements Plugin<Project> {
new JavaPluginAction(singlePublishedArtifact), new JavaPluginAction(singlePublishedArtifact),
new WarPluginAction(singlePublishedArtifact), new WarPluginAction(singlePublishedArtifact),
new MavenPluginAction(bootArchives.getUploadTaskName()), new MavenPluginAction(bootArchives.getUploadTaskName()),
new DependencyManagementPluginAction(), new ApplicationPluginAction()); new DependencyManagementPluginAction(), new ApplicationPluginAction(),
new KotlinPluginAction());
for (PluginApplicationAction action : actions) { for (PluginApplicationAction action : actions) {
project.getPlugins().withType(action.getPluginClass(), Class<? extends Plugin<? extends Project>> pluginClass = action
(plugin) -> action.execute(project)); .getPluginClass();
if (pluginClass != null) {
project.getPlugins().withType(pluginClass,
(plugin) -> action.execute(project));
}
} }
} }

View File

@ -0,0 +1,54 @@
/*
* Copyright 2012-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.gradle.plugin;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.gradle.junit.GradleCompatibilitySuite;
import org.springframework.boot.gradle.testkit.GradleBuild;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Integration tests for {@link KotlinPluginAction}.
*
* @author Andy Wilkinson
*/
@RunWith(GradleCompatibilitySuite.class)
public class KotlinPluginActionIntegrationTests {
@Rule
public GradleBuild gradleBuild;
@Test
public void noKotlinVersionPropertyWithoutKotlinPlugin() {
assertThat(this.gradleBuild.build("kotlinVersion").getOutput())
.contains("Kotlin version: none");
}
@Test
public void kotlinVersionMatchesKotlinPluginVersion() {
String output = this.gradleBuild
.build("kotlinVersion", "dependencies", "--configuration", "compile")
.getOutput();
assertThat(output).contains("Kotlin version: 1.2.10");
assertThat(output).contains("org.jetbrains.kotlin:kotlin-stdlib-jdk8: -> 1.2.10");
}
}

View File

@ -0,0 +1,39 @@
buildscript {
dependencies {
classpath files(pluginClasspath.split(','))
}
}
plugins {
id 'org.jetbrains.kotlin.jvm' version '1.2.10'
}
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
dependencyManagement {
resolutionStrategy {
eachDependency {
if (it.requested.group == 'org.springframework.boot') {
it.useVersion project.bootVersion
}
}
}
}
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
compile 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
}
task kotlinVersion {
doLast {
def kotlinVersion = project.hasProperty('kotlin.version') ? project.getProperty('kotlin.version') : 'none'
println "Kotlin version: ${kotlinVersion}"
}
}

View File

@ -0,0 +1,14 @@
buildscript {
dependencies {
classpath files(pluginClasspath.split(','))
}
}
apply plugin: 'org.springframework.boot'
task kotlinVersion {
doLast {
def kotlinVersion = project.hasProperty('kotlin.version') ? project.getProperty('kotlin.version') : 'none'
println "Kotlin version: ${kotlinVersion}"
}
}