Make sure that core Gradle plugins are applied first

Closes gh-1343
This commit is contained in:
Stephane Nicoll 2022-11-11 08:21:21 +01:00
parent 186fdeaa2f
commit 59935b8175
33 changed files with 94 additions and 123 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright 2012-2019 the original author or authors.
* Copyright 2012-2022 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.
@ -16,6 +16,8 @@
package io.spring.initializr.generator.spring.build;
import java.util.function.Consumer;
import io.spring.initializr.generator.buildsystem.Build;
import org.springframework.core.Ordered;
@ -38,4 +40,39 @@ public interface BuildCustomizer<B extends Build> extends Ordered {
return 0;
}
/**
* Create a {@link BuildCustomizer} that is ordered with the specified {@code order}
* value.
* @param order the order of the customizer
* @param customizer the customizer
* @param <B> the type of the build
* @return a {@link BuildCustomizer} with the specified order
*/
static <B extends Build> BuildCustomizer<B> ordered(int order, Consumer<B> customizer) {
return new OrderedBuildCustomizer<>(order, customizer);
}
class OrderedBuildCustomizer<B extends Build> implements BuildCustomizer<B> {
private final int order;
private final Consumer<B> customizer;
public OrderedBuildCustomizer(int order, Consumer<B> customizer) {
this.order = order;
this.customizer = customizer;
}
@Override
public void customize(B build) {
this.customizer.accept(build);
}
@Override
public int getOrder() {
return this.order;
}
}
}

View File

@ -31,6 +31,7 @@ import io.spring.initializr.generator.condition.ConditionalOnLanguage;
import io.spring.initializr.generator.condition.ConditionalOnPackaging;
import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion;
import io.spring.initializr.generator.io.IndentingWriterFactory;
import io.spring.initializr.generator.language.groovy.GroovyLanguage;
import io.spring.initializr.generator.language.java.JavaLanguage;
import io.spring.initializr.generator.packaging.war.WarPackaging;
import io.spring.initializr.generator.project.ProjectDescription;
@ -42,6 +43,7 @@ import io.spring.initializr.metadata.InitializrMetadata;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
/**
* Configuration for contributions specific to the generation of a project that will use
@ -54,6 +56,10 @@ import org.springframework.context.annotation.Configuration;
@ConditionalOnBuildSystem(GradleBuildSystem.ID)
public class GradleProjectGenerationConfiguration {
private static final int LANGUAGE_PLUGINS_ORDER = Ordered.HIGHEST_PRECEDENCE + 5;
private static final int PACKAGING_PLUGINS_ORDER = Ordered.HIGHEST_PRECEDENCE + 10;
private static final int TEST_ORDER = 100;
private final IndentingWriterFactory indentingWriterFactory;
@ -91,13 +97,19 @@ public class GradleProjectGenerationConfiguration {
@Bean
@ConditionalOnLanguage(JavaLanguage.ID)
public BuildCustomizer<GradleBuild> javaPluginContributor() {
return (build) -> build.plugins().add("java");
return BuildCustomizer.ordered(LANGUAGE_PLUGINS_ORDER, (build) -> build.plugins().add("java"));
}
@Bean
@ConditionalOnLanguage(GroovyLanguage.ID)
public BuildCustomizer<GradleBuild> groovyPluginContributor() {
return BuildCustomizer.ordered(LANGUAGE_PLUGINS_ORDER, (build) -> build.plugins().add("groovy"));
}
@Bean
@ConditionalOnPackaging(WarPackaging.ID)
public BuildCustomizer<GradleBuild> warPluginContributor() {
return (build) -> build.plugins().add("war");
return BuildCustomizer.ordered(PACKAGING_PLUGINS_ORDER, (build) -> build.plugins().add("war"));
}
@Bean

View File

@ -1,34 +0,0 @@
/*
* Copyright 2012-2019 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
*
* https://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 io.spring.initializr.generator.spring.code.groovy;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuild;
import io.spring.initializr.generator.spring.build.BuildCustomizer;
/**
* {@link BuildCustomizer} for Groovy projects build with Gradle.
*
* @author Stephane Nicoll
*/
class GroovyGradleBuildCustomizer implements BuildCustomizer<GradleBuild> {
@Override
public void customize(GradleBuild build) {
build.plugins().add("groovy");
}
}

View File

@ -19,7 +19,6 @@ package io.spring.initializr.generator.spring.code.groovy;
import java.lang.reflect.Modifier;
import io.spring.initializr.generator.buildsystem.Build;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem;
import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem;
import io.spring.initializr.generator.condition.ConditionalOnBuildSystem;
import io.spring.initializr.generator.condition.ConditionalOnPackaging;
@ -116,18 +115,4 @@ class GroovyProjectGenerationDefaultContributorsConfiguration {
}
/**
* Configuration for Groovy projects built with Gradle.
*/
@Configuration
@ConditionalOnBuildSystem(GradleBuildSystem.ID)
static class GroovyGradleProjectConfiguration {
@Bean
GroovyGradleBuildCustomizer groovyBuildCustomizer() {
return new GroovyGradleBuildCustomizer();
}
}
}

View File

@ -113,9 +113,9 @@ class GradleKtsProjectGenerationConfigurationTests {
assertThat(project).textFile("build.gradle.kts")
.containsExactly(// @formatter:off
"plugins {",
" java",
" id(\"org.springframework.boot\") version \"2.4.0\"",
" id(\"io.spring.dependency-management\") version \"1.0.6.RELEASE\"",
" java",
"}",
"",
"group = \"com.example\"",

View File

@ -24,6 +24,7 @@ import io.spring.initializr.generator.buildsystem.Dependency;
import io.spring.initializr.generator.buildsystem.DependencyScope;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem;
import io.spring.initializr.generator.buildsystem.gradle.GroovyDslGradleBuildWriter;
import io.spring.initializr.generator.language.groovy.GroovyLanguage;
import io.spring.initializr.generator.language.java.JavaLanguage;
import io.spring.initializr.generator.packaging.war.WarPackaging;
import io.spring.initializr.generator.project.MutableProjectDescription;
@ -110,9 +111,9 @@ class GradleProjectGenerationConfigurationTests {
assertThat(project).textFile("build.gradle").containsExactly(
// @formatter:off
"plugins {",
" id 'java'",
" id 'org.springframework.boot' version '2.4.0'",
" id 'io.spring.dependency-management' version '1.0.6.RELEASE'",
" id 'java'",
"}",
"",
"group = 'com.example'",
@ -134,6 +135,15 @@ class GradleProjectGenerationConfigurationTests {
"}"); // @formatter:on
}
@Test
void groovyPluginIsAppliedWhenBuildingProjectThatUsesGroovyLanguage() {
MutableProjectDescription description = new MutableProjectDescription();
description.setPlatformVersion(Version.parse("2.4.0.RELEASE"));
description.setLanguage(new GroovyLanguage());
ProjectStructure project = this.projectTester.generate(description);
assertThat(project).textFile("build.gradle").lines().containsOnlyOnce(" id 'groovy'");
}
@Test
void warPluginIsAppliedWhenBuildingProjectThatUsesWarPackaging() {
MutableProjectDescription description = new MutableProjectDescription();

View File

@ -1,39 +0,0 @@
/*
* Copyright 2012-2020 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
*
* https://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 io.spring.initializr.generator.spring.code.groovy;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuild;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link GroovyGradleBuildCustomizer}.
*
* @author Stephane Nicoll
*/
class GroovyGradleBuildCustomizerTests {
@Test
void groovyPluginIsConfigured() {
GradleBuild build = new GradleBuild();
new GroovyGradleBuildCustomizer().customize(build);
assertThat(build.plugins().values()).singleElement()
.satisfies((plugin) -> assertThat(plugin.getId()).isEqualTo("groovy"));
}
}

View File

@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'java'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
java
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
java
}
group = "com.example"

View File

@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'java'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
java
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
java
}
group = "com.example"

View File

@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'java'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
java
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
java
}
group = "com.example"

View File

@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'java'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
java
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
java
}
group = "com.example"

View File

@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'java'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
java
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
java
}
group = "com.example"

View File

@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.4.0-M1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'java'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
java
id("org.springframework.boot") version "2.4.0-M1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
java
}
group = "com.example"

View File

@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'java'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
java
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
java
}
group = "com.example"

View File

@ -1,7 +1,7 @@
plugins {
id 'groovy'
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'groovy'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
groovy
id("org.springframework.boot") version "3.0.0"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
groovy
}
group = "com.example"

View File

@ -1,7 +1,7 @@
plugins {
id 'groovy'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'groovy'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
groovy
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
groovy
}
group = "com.example"

View File

@ -1,8 +1,8 @@
plugins {
id 'groovy'
id 'war'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'war'
id 'groovy'
}
group = 'com.example'

View File

@ -1,8 +1,8 @@
plugins {
groovy
war
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
war
groovy
}
group = "com.example"

View File

@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'java'
}
group = 'com.example'

View File

@ -1,7 +1,7 @@
plugins {
java
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
java
}
group = "com.example"

View File

@ -1,8 +1,8 @@
plugins {
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'java'
id 'war'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
}
group = 'com.example'

View File

@ -1,8 +1,8 @@
plugins {
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
java
war
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
}
group = "com.example"

View File

@ -1,9 +1,9 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id 'war'
id 'org.springframework.boot' version '2.4.1'
id 'io.spring.dependency-management' version '1.0.6.RELEASE'
id 'war'
id 'org.jetbrains.kotlin.jvm' version '1.1.1'
id 'org.jetbrains.kotlin.plugin.spring' version '1.1.1'
}

View File

@ -1,9 +1,9 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
war
id("org.springframework.boot") version "2.4.1"
id("io.spring.dependency-management") version "1.0.6.RELEASE"
war
kotlin("jvm") version "1.1.1"
kotlin("plugin.spring") version "1.1.1"
}