Move general build settings to immutable class

This commit moves the global build settings to an immutable
BuildSettings abstraction.

See gh-996
This commit is contained in:
Stephane Nicoll 2019-08-30 14:17:59 +02:00
parent 7d47786a8b
commit 3f6c98173b
30 changed files with 473 additions and 240 deletions

View File

@ -38,9 +38,8 @@ public class SimpleBuildCustomizer implements BuildCustomizer<Build> {
@Override @Override
public void customize(Build build) { public void customize(Build build) {
build.setGroup(this.description.getGroupId()); build.settings().group(this.description.getGroupId()).artifact(this.description.getArtifactId())
build.setArtifact(this.description.getArtifactId()); .version(this.description.getVersion());
build.setVersion(this.description.getVersion());
this.description.getRequestedDependencies() this.description.getRequestedDependencies()
.forEach((id, dependency) -> build.dependencies().add(id, dependency)); .forEach((id, dependency) -> build.dependencies().add(id, dependency));
} }

View File

@ -42,7 +42,7 @@ class Gradle3SettingsGradleProjectContributor implements ProjectContributor {
public void contribute(Path projectRoot) throws IOException { public void contribute(Path projectRoot) throws IOException {
Path file = Files.createFile(projectRoot.resolve("settings.gradle")); Path file = Files.createFile(projectRoot.resolve("settings.gradle"));
try (PrintWriter writer = new PrintWriter(Files.newOutputStream(file))) { try (PrintWriter writer = new PrintWriter(Files.newOutputStream(file))) {
writer.println("rootProject.name = '" + this.build.getArtifact() + "'"); writer.println("rootProject.name = '" + this.build.getSettings().getArtifact() + "'");
} }
} }

View File

@ -79,7 +79,7 @@ public class GradleProjectGenerationConfiguration {
@Bean @Bean
public BuildCustomizer<GradleBuild> defaultGradleBuildCustomizer(ProjectDescription description) { public BuildCustomizer<GradleBuild> defaultGradleBuildCustomizer(ProjectDescription description) {
return (build) -> build.setSourceCompatibility(description.getLanguage().jvmVersion()); return (build) -> build.settings().sourceCompatibility(description.getLanguage().jvmVersion());
} }
@Bean @Bean

View File

@ -43,8 +43,7 @@ public class DefaultMavenBuildCustomizer implements BuildCustomizer<MavenBuild>
@Override @Override
public void customize(MavenBuild build) { public void customize(MavenBuild build) {
build.setName(this.description.getName()); build.settings().name(this.description.getName()).description(this.description.getDescription());
build.setDescription(this.description.getDescription());
build.setProperty("java.version", this.description.getLanguage().jvmVersion()); build.setProperty("java.version", this.description.getLanguage().jvmVersion());
build.plugins().add("org.springframework.boot", "spring-boot-maven-plugin"); build.plugins().add("org.springframework.boot", "spring-boot-maven-plugin");
@ -64,7 +63,7 @@ public class DefaultMavenBuildCustomizer implements BuildCustomizer<MavenBuild>
build.setProperty("project.build.sourceEncoding", "UTF-8"); build.setProperty("project.build.sourceEncoding", "UTF-8");
build.setProperty("project.reporting.outputEncoding", "UTF-8"); build.setProperty("project.reporting.outputEncoding", "UTF-8");
} }
build.parent(parentPom.getGroupId(), parentPom.getArtifactId(), parentPom.getVersion()); build.settings().parent(parentPom.getGroupId(), parentPom.getArtifactId(), parentPom.getVersion());
} }
private boolean hasBom(MavenBuild build, BillOfMaterials bom) { private boolean hasBom(MavenBuild build, BillOfMaterials bom) {

View File

@ -72,7 +72,7 @@ public class MavenProjectGenerationConfiguration {
@Bean @Bean
@ConditionalOnPackaging(WarPackaging.ID) @ConditionalOnPackaging(WarPackaging.ID)
public BuildCustomizer<MavenBuild> mavenWarPackagingConfigurer() { public BuildCustomizer<MavenBuild> mavenWarPackagingConfigurer() {
return (build) -> build.setPackaging("war"); return (build) -> build.settings().packaging("war");
} }
} }

View File

@ -39,8 +39,8 @@ class KotlinMavenBuildCustomizer implements BuildCustomizer<MavenBuild> {
@Override @Override
public void customize(MavenBuild build) { public void customize(MavenBuild build) {
build.setProperty("kotlin.version", this.settings.getVersion()); build.setProperty("kotlin.version", this.settings.getVersion());
build.setSourceDirectory("${project.basedir}/src/main/kotlin"); build.settings().sourceDirectory("${project.basedir}/src/main/kotlin")
build.setTestSourceDirectory("${project.basedir}/src/test/kotlin"); .testSourceDirectory("${project.basedir}/src/test/kotlin");
build.plugins().add("org.jetbrains.kotlin", "kotlin-maven-plugin", (kotlinMavenPlugin) -> { build.plugins().add("org.jetbrains.kotlin", "kotlin-maven-plugin", (kotlinMavenPlugin) -> {
kotlinMavenPlugin.configuration((configuration) -> { kotlinMavenPlugin.configuration((configuration) -> {
configuration.configure("args", configuration.configure("args",

View File

@ -36,8 +36,8 @@ class KotlinMavenFullBuildCustomizer implements BuildCustomizer<MavenBuild> {
@Override @Override
public void customize(MavenBuild build) { public void customize(MavenBuild build) {
build.setProperty("kotlin.version", this.settings.getVersion()); build.setProperty("kotlin.version", this.settings.getVersion());
build.setSourceDirectory("${project.basedir}/src/main/kotlin"); build.settings().sourceDirectory("${project.basedir}/src/main/kotlin")
build.setTestSourceDirectory("${project.basedir}/src/test/kotlin"); .testSourceDirectory("${project.basedir}/src/test/kotlin");
build.plugins().add("org.jetbrains.kotlin", "kotlin-maven-plugin", (kotlinMavenPlugin) -> { build.plugins().add("org.jetbrains.kotlin", "kotlin-maven-plugin", (kotlinMavenPlugin) -> {
kotlinMavenPlugin.setVersion("${kotlin.version}"); kotlinMavenPlugin.setVersion("${kotlin.version}");
kotlinMavenPlugin.configuration((configuration) -> { kotlinMavenPlugin.configuration((configuration) -> {

View File

@ -40,8 +40,8 @@ class SimpleBuildCustomizerTests {
description.setGroupId("com.example.acme"); description.setGroupId("com.example.acme");
description.setArtifactId("my-test-project"); description.setArtifactId("my-test-project");
MavenBuild build = customizeBuild(description); MavenBuild build = customizeBuild(description);
assertThat(build.getGroup()).isEqualTo("com.example.acme"); assertThat(build.getSettings().getGroup()).isEqualTo("com.example.acme");
assertThat(build.getArtifact()).isEqualTo("my-test-project"); assertThat(build.getSettings().getArtifact()).isEqualTo("my-test-project");
} }
@Test @Test
@ -49,7 +49,7 @@ class SimpleBuildCustomizerTests {
MutableProjectDescription description = initializeDescription(); MutableProjectDescription description = initializeDescription();
description.setVersion("1.5.6.RELEASE"); description.setVersion("1.5.6.RELEASE");
MavenBuild build = customizeBuild(description); MavenBuild build = customizeBuild(description);
assertThat(build.getVersion()).isEqualTo("1.5.6.RELEASE"); assertThat(build.getSettings().getVersion()).isEqualTo("1.5.6.RELEASE");
} }
@Test @Test

View File

@ -53,8 +53,7 @@ class GradleBuildProjectContributorTests {
@Test @Test
void groovyDslGradleBuildIsContributedToProject() throws IOException { void groovyDslGradleBuildIsContributedToProject() throws IOException {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setGroup("com.example"); build.settings().group("com.example").version("1.0.0-SNAPSHOT");
build.setVersion("1.0.0-SNAPSHOT");
build.buildscript((buildscript) -> buildscript.ext("someVersion", "'1.2.3'")); build.buildscript((buildscript) -> buildscript.ext("someVersion", "'1.2.3'"));
List<String> lines = generateBuild( List<String> lines = generateBuild(
groovyDslGradleBuildProjectContributor(build, IndentingWriterFactory.withDefaultSettings())); groovyDslGradleBuildProjectContributor(build, IndentingWriterFactory.withDefaultSettings()));
@ -84,8 +83,7 @@ class GradleBuildProjectContributorTests {
@Test @Test
void kotlinDslGradleBuildIsContributedToProject() throws IOException { void kotlinDslGradleBuildIsContributedToProject() throws IOException {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setGroup("com.example"); build.settings().group("com.example").version("1.0.0-SNAPSHOT");
build.setVersion("1.0.0-SNAPSHOT");
List<String> lines = generateBuild( List<String> lines = generateBuild(
kotlinDslGradleBuildProjectContributor(build, IndentingWriterFactory.withDefaultSettings())); kotlinDslGradleBuildProjectContributor(build, IndentingWriterFactory.withDefaultSettings()));
assertThat(lines).containsSequence("group = \"com.example\"", "version = \"1.0.0-SNAPSHOT\""); assertThat(lines).containsSequence("group = \"com.example\"", "version = \"1.0.0-SNAPSHOT\"");

View File

@ -44,8 +44,8 @@ class DefaultMavenBuildCustomizerTests {
description.setName("my-demo"); description.setName("my-demo");
description.setDescription("Demonstration project"); description.setDescription("Demonstration project");
MavenBuild build = customizeBuild(metadata, description); MavenBuild build = customizeBuild(metadata, description);
assertThat(build.getName()).isEqualTo("my-demo"); assertThat(build.getSettings().getName()).isEqualTo("my-demo");
assertThat(build.getDescription()).isEqualTo("Demonstration project"); assertThat(build.getSettings().getDescription()).isEqualTo("Demonstration project");
} }
@Test @Test
@ -72,7 +72,7 @@ class DefaultMavenBuildCustomizerTests {
void customizeWhenNoParentShouldUseSpringBootParent() { void customizeWhenNoParentShouldUseSpringBootParent() {
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults().build(); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults().build();
MavenBuild build = customizeBuild(metadata); MavenBuild build = customizeBuild(metadata);
MavenParent parent = build.getParent(); MavenParent parent = build.getSettings().getParent();
assertThat(parent.getGroupId()).isEqualTo("org.springframework.boot"); assertThat(parent.getGroupId()).isEqualTo("org.springframework.boot");
assertThat(parent.getArtifactId()).isEqualTo("spring-boot-starter-parent"); assertThat(parent.getArtifactId()).isEqualTo("spring-boot-starter-parent");
assertThat(parent.getVersion()).isEqualTo("2.0.0"); assertThat(parent.getVersion()).isEqualTo("2.0.0");
@ -83,7 +83,7 @@ class DefaultMavenBuildCustomizerTests {
InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults()
.setMavenParent("com.foo", "foo-parent", "1.0.0-SNAPSHOT", true).build(); .setMavenParent("com.foo", "foo-parent", "1.0.0-SNAPSHOT", true).build();
MavenBuild build = customizeBuild(metadata); MavenBuild build = customizeBuild(metadata);
MavenParent parent = build.getParent(); MavenParent parent = build.getSettings().getParent();
assertThat(parent.getGroupId()).isEqualTo("com.foo"); assertThat(parent.getGroupId()).isEqualTo("com.foo");
assertThat(parent.getArtifactId()).isEqualTo("foo-parent"); assertThat(parent.getArtifactId()).isEqualTo("foo-parent");
assertThat(parent.getVersion()).isEqualTo("1.0.0-SNAPSHOT"); assertThat(parent.getVersion()).isEqualTo("1.0.0-SNAPSHOT");

View File

@ -49,9 +49,8 @@ class MavenBuildProjectContributorTests {
@Test @Test
void pomIsContributedToProject() throws Exception { void pomIsContributedToProject() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo").parent("org.springframework.boot",
build.setArtifact("demo"); "spring-boot-starter-parent", "2.1.0.RELEASE");
build.parent("org.springframework.boot", "spring-boot-starter-parent", "2.1.0.RELEASE");
List<String> lines = generatePom(build); List<String> lines = generatePom(build);
assertThat(lines).containsSequence(" <parent>", " <groupId>org.springframework.boot</groupId>", assertThat(lines).containsSequence(" <parent>", " <groupId>org.springframework.boot</groupId>",
" <artifactId>spring-boot-starter-parent</artifactId>", " <artifactId>spring-boot-starter-parent</artifactId>",
@ -63,9 +62,8 @@ class MavenBuildProjectContributorTests {
IndentingWriterFactory indentingWriterFactory = IndentingWriterFactory.create(new SimpleIndentStrategy(" "), IndentingWriterFactory indentingWriterFactory = IndentingWriterFactory.create(new SimpleIndentStrategy(" "),
(factory) -> factory.indentingStrategy("maven", new SimpleIndentStrategy("\t"))); (factory) -> factory.indentingStrategy("maven", new SimpleIndentStrategy("\t")));
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo").parent("org.springframework.boot",
build.setArtifact("demo"); "spring-boot-starter-parent", "2.1.0.RELEASE");
build.parent("org.springframework.boot", "spring-boot-starter-parent", "2.1.0.RELEASE");
List<String> lines = generatePom(build, indentingWriterFactory); List<String> lines = generatePom(build, indentingWriterFactory);
assertThat(lines).containsSequence("\t<parent>", "\t\t<groupId>org.springframework.boot</groupId>", assertThat(lines).containsSequence("\t<parent>", "\t\t<groupId>org.springframework.boot</groupId>",
"\t\t<artifactId>spring-boot-starter-parent</artifactId>", "\t\t<version>2.1.0.RELEASE</version>"); "\t\t<artifactId>spring-boot-starter-parent</artifactId>", "\t\t<version>2.1.0.RELEASE</version>");

View File

@ -46,8 +46,8 @@ class KotlinMavenBuildCustomizerTests {
void buildSourceDirectoriesAreConfigured() { void buildSourceDirectoriesAreConfigured() {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
new KotlinMavenBuildCustomizer(new SimpleKotlinProjectSettings("1.2.70")).customize(build); new KotlinMavenBuildCustomizer(new SimpleKotlinProjectSettings("1.2.70")).customize(build);
assertThat(build.getSourceDirectory()).isEqualTo("${project.basedir}/src/main/kotlin"); assertThat(build.getSettings().getSourceDirectory()).isEqualTo("${project.basedir}/src/main/kotlin");
assertThat(build.getTestSourceDirectory()).isEqualTo("${project.basedir}/src/test/kotlin"); assertThat(build.getSettings().getTestSourceDirectory()).isEqualTo("${project.basedir}/src/test/kotlin");
} }
@Test @Test

View File

@ -44,8 +44,8 @@ class KotlinMavenFullBuildCustomizerTests {
void buildSourceDirectoriesAreConfigured() { void buildSourceDirectoriesAreConfigured() {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
new KotlinMavenFullBuildCustomizer(new SimpleKotlinProjectSettings("1.2.70")).customize(build); new KotlinMavenFullBuildCustomizer(new SimpleKotlinProjectSettings("1.2.70")).customize(build);
assertThat(build.getSourceDirectory()).isEqualTo("${project.basedir}/src/main/kotlin"); assertThat(build.getSettings().getSourceDirectory()).isEqualTo("${project.basedir}/src/main/kotlin");
assertThat(build.getTestSourceDirectory()).isEqualTo("${project.basedir}/src/test/kotlin"); assertThat(build.getSettings().getTestSourceDirectory()).isEqualTo("${project.basedir}/src/test/kotlin");
} }
@Test @Test

View File

@ -30,12 +30,6 @@ import io.spring.initializr.generator.version.VersionProperty;
*/ */
public abstract class Build { public abstract class Build {
private String group;
private String artifact;
private String version = "0.0.1-SNAPSHOT";
private final Map<VersionProperty, String> versionProperties = new TreeMap<>(); private final Map<VersionProperty, String> versionProperties = new TreeMap<>();
private final DependencyContainer dependencies; private final DependencyContainer dependencies;
@ -63,36 +57,16 @@ public abstract class Build {
} }
/** /**
* Return the identifier of the group for the project. * Return a builder to configure the general settings of this build.
* @return the groupId * @return a builder for {@link BuildSettings}.
*/ */
public String getGroup() { public abstract BuildSettings.Builder<?> settings();
return this.group;
}
public void setGroup(String group) {
this.group = group;
}
/** /**
* Return the identifier of the project. * Return the settings of this build.
* @return the artifactId * @return a {@link BuildSettings}
*/ */
public String getArtifact() { public abstract BuildSettings getSettings();
return this.artifact;
}
public void setArtifact(String artifact) {
this.artifact = artifact;
}
public String getVersion() {
return this.version;
}
public void setVersion(String version) {
this.version = version;
}
public void addVersionProperty(VersionProperty versionProperty, String version) { public void addVersionProperty(VersionProperty versionProperty, String version) {
this.versionProperties.put(versionProperty, version); this.versionProperties.put(versionProperty, version);

View File

@ -0,0 +1,104 @@
/*
* 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.buildsystem;
/**
* General build settings.
*
* @author Stephane Nicoll
*/
public class BuildSettings {
private final String group;
private final String artifact;
private final String version;
protected BuildSettings(Builder<?> builder) {
this.group = builder.group;
this.artifact = builder.artifact;
this.version = builder.version;
}
/**
* Return the identifier of the group for the project.
* @return the group identifier or {@code null}
*/
public String getGroup() {
return this.group;
}
/**
* Return the identifier of the project.
* @return the project identifier or {@code null}
*/
public String getArtifact() {
return this.artifact;
}
/**
* Return the version of the project.
* @return the project version or {@code null}
*/
public String getVersion() {
return this.version;
}
/**
* Builder for build settings.
*
* @param <B> builder type
*/
public abstract static class Builder<B extends Builder> {
private String group;
private String artifact;
private String version = "0.0.1-SNAPSHOT";
protected Builder() {
}
public B group(String group) {
this.group = group;
return self();
}
public B artifact(String artifact) {
this.artifact = artifact;
return self();
}
public B version(String version) {
this.version = version;
return self();
}
@SuppressWarnings("unchecked")
protected B self() {
return (B) this;
}
public BuildSettings build() {
return new BuildSettings(this);
}
}
}

View File

@ -30,6 +30,7 @@ import java.util.function.Consumer;
import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Build;
import io.spring.initializr.generator.buildsystem.BuildItemResolver; import io.spring.initializr.generator.buildsystem.BuildItemResolver;
import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSettings.Builder;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -42,7 +43,7 @@ import org.springframework.util.StringUtils;
*/ */
public class GradleBuild extends Build { public class GradleBuild extends Build {
private String sourceCompatibility; private final GradleBuildSettings.Builder settings = new Builder();
private final Map<String, String> ext = new TreeMap<>(); private final Map<String, String> ext = new TreeMap<>();
@ -68,12 +69,14 @@ public class GradleBuild extends Build {
this(null); this(null);
} }
public void setSourceCompatibility(String sourceCompatibility) { @Override
this.sourceCompatibility = sourceCompatibility; public GradleBuildSettings.Builder settings() {
return this.settings;
} }
public String getSourceCompatibility() { @Override
return this.sourceCompatibility; public GradleBuildSettings getSettings() {
return this.settings.build();
} }
public GradleBuild ext(String key, String value) { public GradleBuild ext(String key, String value) {

View File

@ -0,0 +1,61 @@
/*
* 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.buildsystem.gradle;
import io.spring.initializr.generator.buildsystem.BuildSettings;
/**
* Gradle {@link BuildSettings}.
*
* @author Stephane Nicoll
*/
public class GradleBuildSettings extends BuildSettings {
private final String sourceCompatibility;
protected GradleBuildSettings(Builder builder) {
super(builder);
this.sourceCompatibility = builder.sourceCompatibility;
}
/**
* Return the java version compatibility to use when compiling Java source.
* @return the java version to use for source.
*/
public String getSourceCompatibility() {
return this.sourceCompatibility;
}
/**
* Builder for {@link GradleBuildSettings}.
*/
public static class Builder extends BuildSettings.Builder<Builder> {
private String sourceCompatibility;
public Builder sourceCompatibility(String sourceCompatibility) {
this.sourceCompatibility = sourceCompatibility;
return self();
}
public GradleBuildSettings build() {
return new GradleBuildSettings(this);
}
}
}

View File

@ -54,12 +54,13 @@ import io.spring.initializr.generator.version.VersionProperty;
public abstract class GradleBuildWriter { public abstract class GradleBuildWriter {
public final void writeTo(IndentingWriter writer, GradleBuild build) throws IOException { public final void writeTo(IndentingWriter writer, GradleBuild build) throws IOException {
GradleBuildSettings settings = build.getSettings();
writeImports(writer, build); writeImports(writer, build);
writeBuildscript(writer, build); writeBuildscript(writer, build);
writePlugins(writer, build); writePlugins(writer, build);
writeProperty(writer, "group", build.getGroup()); writeProperty(writer, "group", settings.getGroup());
writeProperty(writer, "version", build.getVersion()); writeProperty(writer, "version", settings.getVersion());
writeJavaSourceCompatibility(writer, build); writeJavaSourceCompatibility(writer, settings);
writer.println(); writer.println();
writeConfigurations(writer, build); writeConfigurations(writer, build);
writeRepositories(writer, build); writeRepositories(writer, build);
@ -87,7 +88,7 @@ public abstract class GradleBuildWriter {
.map(StandardGradlePlugin.class::cast).collect(Collectors.toList()); .map(StandardGradlePlugin.class::cast).collect(Collectors.toList());
} }
protected abstract void writeJavaSourceCompatibility(IndentingWriter writer, GradleBuild build); protected abstract void writeJavaSourceCompatibility(IndentingWriter writer, GradleBuildSettings settings);
protected abstract void writeConfigurations(IndentingWriter writer, GradleBuild build); protected abstract void writeConfigurations(IndentingWriter writer, GradleBuild build);

View File

@ -33,7 +33,7 @@ public abstract class GradleSettingsWriter {
public final void writeTo(IndentingWriter writer, GradleBuild build) throws IOException { public final void writeTo(IndentingWriter writer, GradleBuild build) throws IOException {
writePluginManagement(writer, build); writePluginManagement(writer, build);
writer.println("rootProject.name = " + wrapWithQuotes(build.getArtifact())); writer.println("rootProject.name = " + wrapWithQuotes(build.getSettings().getArtifact()));
} }
private void writePluginManagement(IndentingWriter writer, GradleBuild build) { private void writePluginManagement(IndentingWriter writer, GradleBuild build) {

View File

@ -88,8 +88,8 @@ public class GroovyDslGradleBuildWriter extends GradleBuildWriter {
} }
@Override @Override
protected void writeJavaSourceCompatibility(IndentingWriter writer, GradleBuild build) { protected void writeJavaSourceCompatibility(IndentingWriter writer, GradleBuildSettings settings) {
writeProperty(writer, "sourceCompatibility", build.getSourceCompatibility()); writeProperty(writer, "sourceCompatibility", settings.getSourceCompatibility());
} }
@Override @Override

View File

@ -98,9 +98,9 @@ public class KotlinDslGradleBuildWriter extends GradleBuildWriter {
} }
@Override @Override
protected void writeJavaSourceCompatibility(IndentingWriter writer, GradleBuild build) { protected void writeJavaSourceCompatibility(IndentingWriter writer, GradleBuildSettings settings) {
writer.println("java.sourceCompatibility = JavaVersion." writer.println("java.sourceCompatibility = JavaVersion."
+ sourceCompatibilitiesToJavaVersion.get(build.getSourceCompatibility())); + sourceCompatibilitiesToJavaVersion.get(settings.getSourceCompatibility()));
} }
@Override @Override

View File

@ -22,6 +22,7 @@ import java.util.TreeMap;
import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Build;
import io.spring.initializr.generator.buildsystem.BuildItemResolver; import io.spring.initializr.generator.buildsystem.BuildItemResolver;
import io.spring.initializr.generator.buildsystem.maven.MavenBuildSettings.Builder;
/** /**
* Maven build for a project. * Maven build for a project.
@ -31,15 +32,7 @@ import io.spring.initializr.generator.buildsystem.BuildItemResolver;
*/ */
public class MavenBuild extends Build { public class MavenBuild extends Build {
private MavenParent parent; private final MavenBuildSettings.Builder settings = new Builder();
private String name;
private String description;
private String sourceDirectory;
private String testSourceDirectory;
private final Map<String, String> properties = new TreeMap<>(); private final Map<String, String> properties = new TreeMap<>();
@ -49,8 +42,6 @@ public class MavenBuild extends Build {
private MavenPluginContainer plugins = new MavenPluginContainer(); private MavenPluginContainer plugins = new MavenPluginContainer();
private String packaging;
public MavenBuild(BuildItemResolver buildItemResolver) { public MavenBuild(BuildItemResolver buildItemResolver) {
super(buildItemResolver); super(buildItemResolver);
} }
@ -59,29 +50,14 @@ public class MavenBuild extends Build {
this(null); this(null);
} }
public MavenParent parent(String groupId, String artifactId, String version) { @Override
this.parent = new MavenParent(groupId, artifactId, version); public MavenBuildSettings.Builder settings() {
return this.parent; return this.settings;
} }
public MavenParent getParent() { @Override
return this.parent; public MavenBuildSettings getSettings() {
} return this.settings.build();
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setDescription(String description) {
this.description = description;
}
public String getDescription() {
return this.description;
} }
public void setProperty(String key, String value) { public void setProperty(String key, String value) {
@ -92,22 +68,6 @@ public class MavenBuild extends Build {
return Collections.unmodifiableMap(this.properties); return Collections.unmodifiableMap(this.properties);
} }
public String getSourceDirectory() {
return this.sourceDirectory;
}
public void setSourceDirectory(String sourceDirectory) {
this.sourceDirectory = sourceDirectory;
}
public String getTestSourceDirectory() {
return this.testSourceDirectory;
}
public void setTestSourceDirectory(String testSourceDirectory) {
this.testSourceDirectory = testSourceDirectory;
}
public MavenResourceContainer resources() { public MavenResourceContainer resources() {
return this.resources; return this.resources;
} }
@ -120,12 +80,4 @@ public class MavenBuild extends Build {
return this.plugins; return this.plugins;
} }
public void setPackaging(String packaging) {
this.packaging = packaging;
}
public String getPackaging() {
return this.packaging;
}
} }

View File

@ -0,0 +1,165 @@
/*
* 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.buildsystem.maven;
import io.spring.initializr.generator.buildsystem.BuildSettings;
/**
* Maven {@link BuildSettings}.
*
* @author Stephane Nicoll
*/
public class MavenBuildSettings extends BuildSettings {
private final MavenParent parent;
private final String packaging;
private final String name;
private final String description;
private final String sourceDirectory;
private final String testSourceDirectory;
protected MavenBuildSettings(Builder builder) {
super(builder);
this.parent = builder.parent;
this.packaging = builder.packaging;
this.name = builder.name;
this.description = builder.description;
this.sourceDirectory = builder.sourceDirectory;
this.testSourceDirectory = builder.testSourceDirectory;
}
/**
* Return the {@link MavenParent} to use or {@code null} if this project has no
* parent.
* @return the parent pom or {@code null}
*/
public MavenParent getParent() {
return this.parent;
}
/**
* Return the {@code packaging} to use or {@code null} to use the default {@code jar}
* packaging.
* @return the packaging to use
*/
public String getPackaging() {
return this.packaging;
}
/**
* Return a simple name for the project.
* @return the name of the project or {@code null}
*/
public String getName() {
return this.name;
}
/**
* Return a human readable description of the project.
* @return the description of the project or {@code null}
*/
public String getDescription() {
return this.description;
}
/**
* Return the location of main source code. Can use Maven properties such as
* {@code ${basedir}}.
* @return the location of main source code or {@code null} to use the default
*/
public String getSourceDirectory() {
return this.sourceDirectory;
}
/**
* Return the location of test source code. Can use Maven properties such as
* {@code ${basedir}}.
* @return the location of test source code or {@code null} to use the default
*/
public String getTestSourceDirectory() {
return this.testSourceDirectory;
}
/**
* Builder for a Maven dependency.
*
* @see MavenDependency#withCoordinates(String, String)
*/
public static class Builder extends BuildSettings.Builder<Builder> {
private MavenParent parent;
private String packaging;
private String name;
private String description;
private String sourceDirectory;
private String testSourceDirectory;
public Builder() {
}
public Builder coordinates(String groupId, String artifactId) {
return group(groupId).artifact(artifactId);
}
public Builder parent(String groupId, String artifactId, String version) {
this.parent = new MavenParent(groupId, artifactId, version);
return self();
}
public Builder packaging(String packaging) {
this.packaging = packaging;
return self();
}
public Builder name(String name) {
this.name = name;
return self();
}
public Builder description(String description) {
this.description = description;
return self();
}
public Builder sourceDirectory(String sourceDirectory) {
this.sourceDirectory = sourceDirectory;
return self();
}
public Builder testSourceDirectory(String testSourceDirectory) {
this.testSourceDirectory = testSourceDirectory;
return self();
}
@Override
public MavenBuildSettings build() {
return new MavenBuildSettings(this);
}
}
}

View File

@ -49,11 +49,12 @@ import io.spring.initializr.generator.version.VersionReference;
public class MavenBuildWriter { public class MavenBuildWriter {
public void writeTo(IndentingWriter writer, MavenBuild build) throws IOException { public void writeTo(IndentingWriter writer, MavenBuild build) throws IOException {
MavenBuildSettings settings = build.getSettings();
writeProject(writer, () -> { writeProject(writer, () -> {
writeParent(writer, build); writeParent(writer, build);
writeProjectCoordinates(writer, build); writeProjectCoordinates(writer, settings);
writePackaging(writer, build); writePackaging(writer, settings);
writeProjectName(writer, build); writeProjectName(writer, settings);
writeProperties(writer, build); writeProperties(writer, build);
writeDependencies(writer, build); writeDependencies(writer, build);
writeDependencyManagement(writer, build); writeDependencyManagement(writer, build);
@ -77,7 +78,7 @@ public class MavenBuildWriter {
} }
private void writeParent(IndentingWriter writer, MavenBuild build) { private void writeParent(IndentingWriter writer, MavenBuild build) {
MavenParent parent = build.getParent(); MavenParent parent = build.getSettings().getParent();
if (parent == null) { if (parent == null) {
return; return;
} }
@ -91,22 +92,22 @@ public class MavenBuildWriter {
writer.println("</parent>"); writer.println("</parent>");
} }
private void writeProjectCoordinates(IndentingWriter writer, MavenBuild build) { private void writeProjectCoordinates(IndentingWriter writer, MavenBuildSettings settings) {
writeSingleElement(writer, "groupId", build.getGroup()); writeSingleElement(writer, "groupId", settings.getGroup());
writeSingleElement(writer, "artifactId", build.getArtifact()); writeSingleElement(writer, "artifactId", settings.getArtifact());
writeSingleElement(writer, "version", build.getVersion()); writeSingleElement(writer, "version", settings.getVersion());
} }
private void writePackaging(IndentingWriter writer, MavenBuild build) { private void writePackaging(IndentingWriter writer, MavenBuildSettings settings) {
String packaging = build.getPackaging(); String packaging = settings.getPackaging();
if (!"jar".equals(packaging)) { if (!"jar".equals(packaging)) {
writeSingleElement(writer, "packaging", packaging); writeSingleElement(writer, "packaging", packaging);
} }
} }
private void writeProjectName(IndentingWriter writer, MavenBuild build) { private void writeProjectName(IndentingWriter writer, MavenBuildSettings settings) {
writeSingleElement(writer, "name", build.getName()); writeSingleElement(writer, "name", settings.getName());
writeSingleElement(writer, "description", build.getDescription()); writeSingleElement(writer, "description", settings.getDescription());
} }
private void writeProperties(IndentingWriter writer, MavenBuild build) { private void writeProperties(IndentingWriter writer, MavenBuild build) {
@ -240,14 +241,15 @@ public class MavenBuildWriter {
} }
private void writeBuild(IndentingWriter writer, MavenBuild build) { private void writeBuild(IndentingWriter writer, MavenBuild build) {
if (build.getSourceDirectory() == null && build.getTestSourceDirectory() == null && build.resources().isEmpty() MavenBuildSettings settings = build.getSettings();
&& build.testResources().isEmpty() && build.plugins().isEmpty()) { if (settings.getSourceDirectory() == null && settings.getTestSourceDirectory() == null
&& build.resources().isEmpty() && build.testResources().isEmpty() && build.plugins().isEmpty()) {
return; return;
} }
writer.println(); writer.println();
writeElement(writer, "build", () -> { writeElement(writer, "build", () -> {
writeSingleElement(writer, "sourceDirectory", build.getSourceDirectory()); writeSingleElement(writer, "sourceDirectory", settings.getSourceDirectory());
writeSingleElement(writer, "testSourceDirectory", build.getTestSourceDirectory()); writeSingleElement(writer, "testSourceDirectory", settings.getTestSourceDirectory());
writeResources(writer, build); writeResources(writer, build);
writePlugins(writer, build); writePlugins(writer, build);

View File

@ -16,6 +16,7 @@
package io.spring.initializr.generator.buildsystem; package io.spring.initializr.generator.buildsystem;
import io.spring.initializr.generator.buildsystem.BuildSettings.Builder;
import org.assertj.core.api.Assertions; import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -76,10 +77,31 @@ class BuildTests {
private static class TestBuild extends Build { private static class TestBuild extends Build {
private final TestBuildSettingsBuilder settings = new TestBuildSettingsBuilder();
TestBuild(BuildItemResolver buildItemResolver) { TestBuild(BuildItemResolver buildItemResolver) {
super(buildItemResolver); super(buildItemResolver);
} }
@Override
public Builder<?> settings() {
return this.settings;
}
@Override
public BuildSettings getSettings() {
return this.settings.build();
}
private static class TestBuildSettingsBuilder extends BuildSettings.Builder<TestBuildSettingsBuilder> {
@Override
public BuildSettings build() {
return new BuildSettings(this);
}
}
} }
} }

View File

@ -43,8 +43,7 @@ class GroovyDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithCoordinates() throws IOException { void gradleBuildWithCoordinates() throws IOException {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setGroup("com.example"); build.settings().group("com.example").version("1.0.1-SNAPSHOT");
build.setVersion("1.0.1-SNAPSHOT");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).contains("group = 'com.example'", "version = '1.0.1-SNAPSHOT'"); assertThat(lines).contains("group = 'com.example'", "version = '1.0.1-SNAPSHOT'");
} }
@ -52,7 +51,7 @@ class GroovyDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithSourceCompatibility() throws IOException { void gradleBuildWithSourceCompatibility() throws IOException {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setSourceCompatibility("11"); build.settings().sourceCompatibility("11");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).contains("sourceCompatibility = '11'"); assertThat(lines).contains("sourceCompatibility = '11'");
} }
@ -206,8 +205,6 @@ class GroovyDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithExt() throws Exception { void gradleBuildWithExt() throws Exception {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setGroup("com.example.demo");
build.setArtifact("demo");
build.ext("java.version", "'1.8'").ext("alpha", "file(\"build/example\")"); build.ext("java.version", "'1.8'").ext("alpha", "file(\"build/example\")");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).containsSequence(" set('alpha', file(\"build/example\"))", assertThat(lines).containsSequence(" set('alpha', file(\"build/example\"))",
@ -251,8 +248,6 @@ class GroovyDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithExtAndVersionProperties() throws Exception { void gradleBuildWithExtAndVersionProperties() throws Exception {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setGroup("com.example.demo");
build.setArtifact("demo");
build.addInternalVersionProperty("test-version", "1.0"); build.addInternalVersionProperty("test-version", "1.0");
build.addExternalVersionProperty("alpha-version", "0.1"); build.addExternalVersionProperty("alpha-version", "0.1");
build.ext("myProperty", "'42'"); build.ext("myProperty", "'42'");
@ -424,7 +419,7 @@ class GroovyDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithCustomVersion() throws IOException { void gradleBuildWithCustomVersion() throws IOException {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setVersion("1.2.4.RELEASE"); build.settings().version("1.2.4.RELEASE");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).contains("version = '1.2.4.RELEASE'"); assertThat(lines).contains("version = '1.2.4.RELEASE'");
} }

View File

@ -79,7 +79,7 @@ class GroovyDslGradleSettingsWriterTests {
@Test @Test
void artifactIdShouldBeUsedAsTheRootProjectName() throws Exception { void artifactIdShouldBeUsedAsTheRootProjectName() throws Exception {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setArtifact("my-application"); build.settings().artifact("my-application");
List<String> lines = generateSettings(build); List<String> lines = generateSettings(build);
assertThat(lines).containsSequence("rootProject.name = 'my-application'"); assertThat(lines).containsSequence("rootProject.name = 'my-application'");
} }

View File

@ -42,8 +42,7 @@ class KotlinDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithCoordinates() throws IOException { void gradleBuildWithCoordinates() throws IOException {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setGroup("com.example"); build.settings().group("com.example").version("1.0.1-SNAPSHOT");
build.setVersion("1.0.1-SNAPSHOT");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).contains("group = \"com.example\"", "version = \"1.0.1-SNAPSHOT\""); assertThat(lines).contains("group = \"com.example\"", "version = \"1.0.1-SNAPSHOT\"");
} }
@ -51,7 +50,7 @@ class KotlinDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithSourceCompatibility11() throws IOException { void gradleBuildWithSourceCompatibility11() throws IOException {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setSourceCompatibility("11"); build.settings().sourceCompatibility("11");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).contains("java.sourceCompatibility = JavaVersion.VERSION_11"); assertThat(lines).contains("java.sourceCompatibility = JavaVersion.VERSION_11");
} }
@ -59,7 +58,7 @@ class KotlinDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithSourceCompatibility1Dot8() throws IOException { void gradleBuildWithSourceCompatibility1Dot8() throws IOException {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setSourceCompatibility("1.8"); build.settings().sourceCompatibility("1.8");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).contains("java.sourceCompatibility = JavaVersion.VERSION_1_8"); assertThat(lines).contains("java.sourceCompatibility = JavaVersion.VERSION_1_8");
} }
@ -211,8 +210,6 @@ class KotlinDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithExt() throws Exception { void gradleBuildWithExt() throws Exception {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setGroup("com.example.demo");
build.setArtifact("demo");
build.ext("java.version", "\"1.8\"").ext("alpha", "file(\"build/example\")"); build.ext("java.version", "\"1.8\"").ext("alpha", "file(\"build/example\")");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).containsSequence("extra[\"alpha\"] = file(\"build/example\")", assertThat(lines).containsSequence("extra[\"alpha\"] = file(\"build/example\")",
@ -256,8 +253,6 @@ class KotlinDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithExtAndVersionProperties() throws Exception { void gradleBuildWithExtAndVersionProperties() throws Exception {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setGroup("com.example.demo");
build.setArtifact("demo");
build.addInternalVersionProperty("test-version", "1.0"); build.addInternalVersionProperty("test-version", "1.0");
build.addExternalVersionProperty("alpha-version", "0.1"); build.addExternalVersionProperty("alpha-version", "0.1");
build.ext("myProperty", "42"); build.ext("myProperty", "42");
@ -432,7 +427,7 @@ class KotlinDslGradleBuildWriterTests {
@Test @Test
void gradleBuildWithCustomVersion() throws IOException { void gradleBuildWithCustomVersion() throws IOException {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setVersion("1.2.4.RELEASE"); build.settings().version("1.2.4.RELEASE");
List<String> lines = generateBuild(build); List<String> lines = generateBuild(build);
assertThat(lines).contains("version = \"1.2.4.RELEASE\""); assertThat(lines).contains("version = \"1.2.4.RELEASE\"");
} }

View File

@ -78,7 +78,7 @@ class KotlinDslGradleSettingsWriterTests {
@Test @Test
void artifactIdShouldBeUsedAsTheRootProjectName() throws Exception { void artifactIdShouldBeUsedAsTheRootProjectName() throws Exception {
GradleBuild build = new GradleBuild(); GradleBuild build = new GradleBuild();
build.setArtifact("my-application"); build.settings().artifact("my-application");
List<String> lines = generateSettings(build); List<String> lines = generateSettings(build);
assertThat(lines).containsSequence("rootProject.name = \"my-application\""); assertThat(lines).containsSequence("rootProject.name = \"my-application\"");
} }

View File

@ -40,9 +40,7 @@ class MavenBuildWriterTests {
@Test @Test
void basicPom() throws Exception { void basicPom() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo").version("1.0.1-SNAPSHOT");
build.setArtifact("demo");
build.setVersion("1.0.1-SNAPSHOT");
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
assertThat(pom).textAtPath("/project/modelVersion").isEqualTo("4.0.0"); assertThat(pom).textAtPath("/project/modelVersion").isEqualTo("4.0.0");
assertThat(pom).textAtPath("/project/groupId").isEqualTo("com.example.demo"); assertThat(pom).textAtPath("/project/groupId").isEqualTo("com.example.demo");
@ -54,10 +52,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithNameAndDescription() throws Exception { void pomWithNameAndDescription() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo").name("demo project").description("A demo project");
build.setArtifact("demo");
build.setName("demo project");
build.setDescription("A demo project");
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
assertThat(pom).textAtPath("/project/modelVersion").isEqualTo("4.0.0"); assertThat(pom).textAtPath("/project/modelVersion").isEqualTo("4.0.0");
assertThat(pom).textAtPath("/project/groupId").isEqualTo("com.example.demo"); assertThat(pom).textAtPath("/project/groupId").isEqualTo("com.example.demo");
@ -71,9 +66,8 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithParent() throws Exception { void pomWithParent() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo").parent("org.springframework.boot",
build.setArtifact("demo"); "spring-boot-starter-parent", "2.1.0.RELEASE");
build.parent("org.springframework.boot", "spring-boot-starter-parent", "2.1.0.RELEASE");
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
assertThat(pom).textAtPath("/project/parent/groupId").isEqualTo("org.springframework.boot"); assertThat(pom).textAtPath("/project/parent/groupId").isEqualTo("org.springframework.boot");
assertThat(pom).textAtPath("/project/parent/artifactId").isEqualTo("spring-boot-starter-parent"); assertThat(pom).textAtPath("/project/parent/artifactId").isEqualTo("spring-boot-starter-parent");
@ -84,17 +78,14 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithPackaging() throws Exception { void pomWithPackaging() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo").packaging("war");
build.setArtifact("demo");
build.setPackaging("war");
generatePom(build, (pom) -> assertThat(pom).textAtPath("/project/packaging").isEqualTo("war")); generatePom(build, (pom) -> assertThat(pom).textAtPath("/project/packaging").isEqualTo("war"));
} }
@Test @Test
void pomWithProperties() throws Exception { void pomWithProperties() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.setProperty("java.version", "1.8"); build.setProperty("java.version", "1.8");
build.setProperty("alpha", "a"); build.setProperty("alpha", "a");
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
@ -119,8 +110,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithAnnotationProcessorDependency() throws Exception { void pomWithAnnotationProcessorDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("annotation-processor", "org.springframework.boot", build.dependencies().add("annotation-processor", "org.springframework.boot",
"spring-boot-configuration-processor", DependencyScope.ANNOTATION_PROCESSOR); "spring-boot-configuration-processor", DependencyScope.ANNOTATION_PROCESSOR);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
@ -136,8 +126,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithCompileOnlyDependency() throws Exception { void pomWithCompileOnlyDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("foo-bar", "org.springframework.boot", "spring-boot-foo-bar", build.dependencies().add("foo-bar", "org.springframework.boot", "spring-boot-foo-bar",
DependencyScope.COMPILE_ONLY); DependencyScope.COMPILE_ONLY);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
@ -153,8 +142,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithCompileDependency() throws Exception { void pomWithCompileDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("root", "org.springframework.boot", "spring-boot-starter", DependencyScope.COMPILE); build.dependencies().add("root", "org.springframework.boot", "spring-boot-starter", DependencyScope.COMPILE);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
NodeAssert dependency = pom.nodeAtPath("/project/dependencies/dependency"); NodeAssert dependency = pom.nodeAtPath("/project/dependencies/dependency");
@ -169,8 +157,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithNoScopeDependencyDefaultsToCompile() throws Exception { void pomWithNoScopeDependencyDefaultsToCompile() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter")); build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter"));
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
NodeAssert dependency = pom.nodeAtPath("/project/dependencies/dependency"); NodeAssert dependency = pom.nodeAtPath("/project/dependencies/dependency");
@ -185,8 +172,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithRuntimeDependency() throws Exception { void pomWithRuntimeDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("hikari", "com.zaxxer", "HikariCP", DependencyScope.RUNTIME); build.dependencies().add("hikari", "com.zaxxer", "HikariCP", DependencyScope.RUNTIME);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
NodeAssert dependency = pom.nodeAtPath("/project/dependencies/dependency"); NodeAssert dependency = pom.nodeAtPath("/project/dependencies/dependency");
@ -201,8 +187,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithProvidedRuntimeDependency() throws Exception { void pomWithProvidedRuntimeDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("tomcat", "org.springframework.boot", "spring-boot-starter-tomcat", build.dependencies().add("tomcat", "org.springframework.boot", "spring-boot-starter-tomcat",
DependencyScope.PROVIDED_RUNTIME); DependencyScope.PROVIDED_RUNTIME);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
@ -218,8 +203,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithTestCompileDependency() throws Exception { void pomWithTestCompileDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("test", "org.springframework.boot", "spring-boot-starter-test", build.dependencies().add("test", "org.springframework.boot", "spring-boot-starter-test",
DependencyScope.TEST_COMPILE); DependencyScope.TEST_COMPILE);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
@ -235,8 +219,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithTestRuntimeDependency() throws Exception { void pomWithTestRuntimeDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("embed-mongo", "de.flapdoodle.embed", "de.flapdoodle.embed.mongo", build.dependencies().add("embed-mongo", "de.flapdoodle.embed", "de.flapdoodle.embed.mongo",
DependencyScope.TEST_RUNTIME); DependencyScope.TEST_RUNTIME);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
@ -252,8 +235,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithExclusions() throws Exception { void pomWithExclusions() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("test", build.dependencies().add("test",
Dependency.withCoordinates("com.example", "test").scope(DependencyScope.COMPILE).exclusions( Dependency.withCoordinates("com.example", "test").scope(DependencyScope.COMPILE).exclusions(
new Exclusion("com.example.legacy", "legacy-one"), new Exclusion("com.example.legacy", "legacy-one"),
@ -278,8 +260,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithOptionalDependency() throws Exception { void pomWithOptionalDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("annotation-processor", build.dependencies().add("annotation-processor",
MavenDependency.withCoordinates("org.springframework.boot", "spring-boot-configuration-processor") MavenDependency.withCoordinates("org.springframework.boot", "spring-boot-configuration-processor")
.scope(DependencyScope.COMPILE).optional(true)); .scope(DependencyScope.COMPILE).optional(true));
@ -296,8 +277,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithNonNullArtifactTypeDependency() throws Exception { void pomWithNonNullArtifactTypeDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter") build.dependencies().add("root", Dependency.withCoordinates("org.springframework.boot", "spring-boot-starter")
.scope(DependencyScope.COMPILE).type("tar.gz")); .scope(DependencyScope.COMPILE).type("tar.gz"));
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
@ -309,8 +289,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithBom() throws Exception { void pomWithBom() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.boms().add("test", "com.example", "my-project-dependencies", VersionReference.ofValue("1.0.0.RELEASE")); build.boms().add("test", "com.example", "my-project-dependencies", VersionReference.ofValue("1.0.0.RELEASE"));
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
NodeAssert dependency = pom.nodeAtPath("/project/dependencyManagement/dependencies/dependency"); NodeAssert dependency = pom.nodeAtPath("/project/dependencyManagement/dependencies/dependency");
@ -321,8 +300,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithOrderedBoms() throws Exception { void pomWithOrderedBoms() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.boms().add("bom1", "com.example", "my-project-dependencies", VersionReference.ofValue("1.0.0.RELEASE"), build.boms().add("bom1", "com.example", "my-project-dependencies", VersionReference.ofValue("1.0.0.RELEASE"),
5); 5);
build.boms().add("bom2", "com.example", "root-dependencies", VersionReference.ofProperty("root.version"), 2); build.boms().add("bom2", "com.example", "root-dependencies", VersionReference.ofProperty("root.version"), 2);
@ -379,8 +357,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithPlugin() throws Exception { void pomWithPlugin() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.plugins().add("org.springframework.boot", "spring-boot-maven-plugin"); build.plugins().add("org.springframework.boot", "spring-boot-maven-plugin");
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
NodeAssert plugin = pom.nodeAtPath("/project/build/plugins/plugin"); NodeAssert plugin = pom.nodeAtPath("/project/build/plugins/plugin");
@ -394,8 +371,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithPluginWithConfiguration() throws Exception { void pomWithPluginWithConfiguration() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.plugins().add("org.jetbrains.kotlin", "kotlin-maven-plugin", build.plugins().add("org.jetbrains.kotlin", "kotlin-maven-plugin",
(plugin) -> plugin.configuration((configuration) -> { (plugin) -> plugin.configuration((configuration) -> {
configuration.configure("args", (args) -> args.add("arg", "-Xjsr305=strict")); configuration.configure("args", (args) -> args.add("arg", "-Xjsr305=strict"));
@ -416,8 +392,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithPluginWithExecution() throws Exception { void pomWithPluginWithExecution() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.plugins().add("org.asciidoctor", "asciidoctor-maven-plugin", (plugin) -> { build.plugins().add("org.asciidoctor", "asciidoctor-maven-plugin", (plugin) -> {
plugin.setVersion("1.5.3"); plugin.setVersion("1.5.3");
plugin.execution("generateProject-docs", (execution) -> { plugin.execution("generateProject-docs", (execution) -> {
@ -447,8 +422,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithPluginWithDependency() throws Exception { void pomWithPluginWithDependency() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.plugins().add("org.jetbrains.kotlin", "kotlin-maven-plugin", build.plugins().add("org.jetbrains.kotlin", "kotlin-maven-plugin",
(plugin) -> plugin.dependency("org.jetbrains.kotlin", "kotlin-maven-allopen", "${kotlin.version}")); (plugin) -> plugin.dependency("org.jetbrains.kotlin", "kotlin-maven-allopen", "${kotlin.version}"));
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
@ -465,8 +439,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithPluginWithExtensions() throws Exception { void pomWithPluginWithExtensions() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.plugins().add("com.example.demo", "demo-plugin", MavenPlugin::extensions); build.plugins().add("com.example.demo", "demo-plugin", MavenPlugin::extensions);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
NodeAssert plugin = pom.nodeAtPath("/project/build/plugins/plugin"); NodeAssert plugin = pom.nodeAtPath("/project/build/plugins/plugin");
@ -479,16 +452,14 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithEmptyBuild() throws Exception { void pomWithEmptyBuild() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
generatePom(build, (pom) -> assertThat(pom).textAtPath("/project/build/").isNullOrEmpty()); generatePom(build, (pom) -> assertThat(pom).textAtPath("/project/build/").isNullOrEmpty());
} }
@Test @Test
void pomWithMavenCentral() throws Exception { void pomWithMavenCentral() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.repositories().add("maven-central"); build.repositories().add("maven-central");
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
assertThat(pom).nodeAtPath("/project/repositories").isNull(); assertThat(pom).nodeAtPath("/project/repositories").isNull();
@ -499,8 +470,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithRepository() throws Exception { void pomWithRepository() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.repositories().add("spring-milestones", "Spring Milestones", "https://repo.spring.io/milestone"); build.repositories().add("spring-milestones", "Spring Milestones", "https://repo.spring.io/milestone");
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
assertThat(pom).textAtPath("/project/repositories/repository/id").isEqualTo("spring-milestones"); assertThat(pom).textAtPath("/project/repositories/repository/id").isEqualTo("spring-milestones");
@ -515,8 +485,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithPluginRepository() throws Exception { void pomWithPluginRepository() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.pluginRepositories().add("spring-milestones", "Spring Milestones", "https://repo.spring.io/milestone"); build.pluginRepositories().add("spring-milestones", "Spring Milestones", "https://repo.spring.io/milestone");
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
assertThat(pom).textAtPath("/project/pluginRepositories/pluginRepository/id") assertThat(pom).textAtPath("/project/pluginRepositories/pluginRepository/id")
@ -533,8 +502,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithSnapshotRepository() throws Exception { void pomWithSnapshotRepository() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.repositories().add("spring-snapshots", "Spring Snapshots", "https://repo.spring.io/snapshot", true); build.repositories().add("spring-snapshots", "Spring Snapshots", "https://repo.spring.io/snapshot", true);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
assertThat(pom).textAtPath("/project/repositories/repository/id").isEqualTo("spring-snapshots"); assertThat(pom).textAtPath("/project/repositories/repository/id").isEqualTo("spring-snapshots");
@ -549,8 +517,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithSnapshotPluginRepository() throws Exception { void pomWithSnapshotPluginRepository() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo");
build.setArtifact("demo");
build.pluginRepositories().add("spring-snapshots", "Spring Snapshots", "https://repo.spring.io/snapshot", true); build.pluginRepositories().add("spring-snapshots", "Spring Snapshots", "https://repo.spring.io/snapshot", true);
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
assertThat(pom).textAtPath("/project/pluginRepositories/pluginRepository/id").isEqualTo("spring-snapshots"); assertThat(pom).textAtPath("/project/pluginRepositories/pluginRepository/id").isEqualTo("spring-snapshots");
@ -567,10 +534,8 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithCustomSourceDirectories() throws Exception { void pomWithCustomSourceDirectories() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setGroup("com.example.demo"); build.settings().coordinates("com.example.demo", "demo").sourceDirectory("${project.basedir}/src/main/kotlin")
build.setArtifact("demo"); .testSourceDirectory("${project.basedir}/src/test/kotlin");
build.setSourceDirectory("${project.basedir}/src/main/kotlin");
build.setTestSourceDirectory("${project.basedir}/src/test/kotlin");
generatePom(build, (pom) -> { generatePom(build, (pom) -> {
assertThat(pom).textAtPath("/project/build/sourceDirectory") assertThat(pom).textAtPath("/project/build/sourceDirectory")
.isEqualTo("${project.basedir}/src/main/kotlin"); .isEqualTo("${project.basedir}/src/main/kotlin");
@ -582,7 +547,7 @@ class MavenBuildWriterTests {
@Test @Test
void pomWithCustomVersion() throws Exception { void pomWithCustomVersion() throws Exception {
MavenBuild build = new MavenBuild(); MavenBuild build = new MavenBuild();
build.setVersion("1.2.4.RELEASE"); build.settings().version("1.2.4.RELEASE");
generatePom(build, (pom) -> assertThat(pom).textAtPath("/project/version").isEqualTo("1.2.4.RELEASE")); generatePom(build, (pom) -> assertThat(pom).textAtPath("/project/version").isEqualTo("1.2.4.RELEASE"));
} }