diff --git a/README.adoc b/README.adoc index ae6dde68..1939f145 100644 --- a/README.adoc +++ b/README.adoc @@ -338,6 +338,8 @@ be set there. Just provide a mapping for the `gradle-props-substition` looking l Example: `"--releaser.pom.ignored-pom-regex=".{asterisk}\\.git/.{asterisk}$,.\{asterisk}spring-cloud-contract-maven-plugin/src/test/projects/.{asterisk}$,.{asterisk}spring-cloud-contract-maven-plugin/target/.{asterisk}$,.{asterisk}samples/standalone/[a-z]+/.{asterisk}$"`. - `releaser.working-dir` - By default Releaser assumes running the program from the current working directory. - `releaser.template.template-folder` - Tells which subfolder with templates to pick for blog, email etc. generation. Defaults to `cloud`. +- `releaser.versions.all-versions-file-url` - Url to a file containing all the versions. Defaults to YAML from start.spring.io. +- `releaser.versions.bom-name` - Name in the YAML from initilizr for BOM mappings. Defaults to `spring-cloud`. TIP: You can pass the options either via system properties or via application arguments. Example for system properties: `java -Dreleaser.pom.branch=Camden.SR6 -jar target/spring-cloud-release-tools-spring-1.0.0.M1.jar` diff --git a/docs/src/main/asciidoc/spring-cloud-release-tools.adoc b/docs/src/main/asciidoc/spring-cloud-release-tools.adoc index e1928589..7b8f9f70 100644 --- a/docs/src/main/asciidoc/spring-cloud-release-tools.adoc +++ b/docs/src/main/asciidoc/spring-cloud-release-tools.adoc @@ -324,6 +324,8 @@ be set there. Just provide a mapping for the `gradle-props-substition` looking l Example: `"--releaser.pom.ignored-pom-regex=".{asterisk}\\.git/.{asterisk}$,.\{asterisk}spring-cloud-contract-maven-plugin/src/test/projects/.{asterisk}$,.{asterisk}spring-cloud-contract-maven-plugin/target/.{asterisk}$,.{asterisk}samples/standalone/[a-z]+/.{asterisk}$"`. - `releaser.working-dir` - By default Releaser assumes running the program from the current working directory. - `releaser.template.template-folder` - Tells which subfolder with templates to pick for blog, email etc. generation. Defaults to `cloud`. +- `releaser.versions.all-versions-file-url` - Url to a file containing all the versions. Defaults to YAML from start.spring.io. +- `releaser.versions.bom-name` - Name in the YAML from initilizr for BOM mappings. Defaults to `spring-cloud`. TIP: You can pass the options either via system properties or via application arguments. Example for system properties: `java -Dreleaser.pom.branch=Camden.SR6 -jar target/spring-cloud-release-tools-spring-1.0.0.M1.jar` diff --git a/spring-cloud-release-tools-core/pom.xml b/spring-cloud-release-tools-core/pom.xml index 31554509..42a4d9f3 100644 --- a/spring-cloud-release-tools-core/pom.xml +++ b/spring-cloud-release-tools-core/pom.xml @@ -96,6 +96,11 @@ handlebars 4.0.6 + + io.spring.initializr + initializr-metadata + 0.8.0.BUILD-SNAPSHOT + org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java index 6a7bd747..f4430730 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/ReleaserProperties.java @@ -61,6 +61,8 @@ public class ReleaserProperties implements Serializable { private Template template = new Template(); + private Versions versions = new Versions(); + /** * Project name to its version - overrides all versions retrieved from a repository * like Spring Cloud Release. @@ -150,13 +152,21 @@ public class ReleaserProperties implements Serializable { this.postReleaseTasksOnly = postReleaseTasksOnly; } + public Versions getVersions() { + return this.versions; + } + + public void setVersions(Versions versions) { + this.versions = versions; + } + @Override public String toString() { return "ReleaserProperties{" + "workingDir='" + this.workingDir + '\'' + ", git=" + this.git + ", pom=" + this.pom + ", maven=" + this.maven + ", gradle=" + this.gradle + ", sagan=" + this.sagan + ", fixedVersions=" + this.fixedVersions + ", metaRelease=" + this.metaRelease + ", template=" - + this.template + '}'; + + this.template + ", versions=" + this.versions + '}'; } public ReleaserProperties copy() { @@ -959,4 +969,41 @@ public class ReleaserProperties implements Serializable { } + public static class Versions implements Serializable { + + /** + * Url to a file containing all the versions. Defaults to YAML from + * start.spring.io. + */ + private String allVersionsFileUrl = "https://raw.githubusercontent.com/spring-io/start.spring.io/master/start-site/src/main/resources/application.yml"; + + /** + * Name in the YAML from initilizr for BOM mappings. + */ + private String bomName = "spring-cloud"; + + public String getAllVersionsFileUrl() { + return this.allVersionsFileUrl; + } + + public void setAllVersionsFileUrl(String allVersionsFileUrl) { + this.allVersionsFileUrl = allVersionsFileUrl; + } + + public String getBomName() { + return bomName; + } + + public void setBomName(String bomName) { + this.bomName = bomName; + } + + @Override + public String toString() { + return "Versions{" + "allVersionsFileUrl='" + this.allVersionsFileUrl + '\'' + + ", bomName='" + this.bomName + '\'' + '}'; + } + + } + } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java index 927f6675..21d88c54 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/pom/ProjectPomUpdater.java @@ -25,8 +25,10 @@ import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Scanner; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -49,6 +51,10 @@ public class ProjectPomUpdater implements ReleaserPropertiesAware { private static final Logger log = LoggerFactory.getLogger(ProjectPomUpdater.class); + private static final boolean UPDATE_FIXED_VERSIONS = true; + + private static final Map CACHE = new ConcurrentHashMap<>(); + private final ProjectGitHandler gitRepo; private final PomUpdater pomUpdater = new PomUpdater(); @@ -71,13 +77,32 @@ public class ProjectPomUpdater implements ReleaserPropertiesAware { * @return projects retrieved from the release train bom */ public Projects retrieveVersionsFromReleaseTrainBom() { - File clonedScRelease = this.gitRepo.cloneReleaseTrainProject(); - this.gitRepo.checkout(clonedScRelease, this.properties.getPom().getBranch()); - BomParser sCReleasePomParser = new BomParser(this.properties, clonedScRelease); - Versions versions = sCReleasePomParser.allVersions(); - log.info("Will update the following versions manually [{}]", - this.properties.getFixedVersions()); - this.properties.getFixedVersions().forEach(versions::setVersion); + return retrieveVersionsFromReleaseTrainBom(this.properties.getPom().getBranch(), + UPDATE_FIXED_VERSIONS); + } + + /** + * For the given root folder (typically the working directory) retrieves list of + * versions for a given release version. + * @param branch branch for which to pick the versions + * @param updateFixedVersions whether should update the retrieved versions with fixed + * ones + * @return projects retrieved from the release train bom + */ + public Projects retrieveVersionsFromReleaseTrainBom(String branch, + boolean updateFixedVersions) { + Versions versions = CACHE.computeIfAbsent(branch, s -> { + File clonedScRelease = this.gitRepo.cloneReleaseTrainProject(); + this.gitRepo.checkout(clonedScRelease, branch); + BomParser sCReleasePomParser = new BomParser(this.properties, + clonedScRelease); + return sCReleasePomParser.allVersions(); + }); + if (updateFixedVersions) { + log.info("Will update the following versions manually [{}]", + this.properties.getFixedVersions()); + this.properties.getFixedVersions().forEach(versions::setVersion); + } log.info("Retrieved the following versions\n{}", versions); return versions.toProjectVersions(); } diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java index 92957bd3..05b031aa 100644 --- a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/project/ProjectBuilder.java @@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.release.internal.ReleaserProperties; import org.springframework.cloud.release.internal.ReleaserPropertiesAware; import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.versions.VersionsFetcher; import org.springframework.util.StringUtils; /** @@ -50,8 +51,12 @@ public class ProjectBuilder implements ReleaserPropertiesAware { private ReleaserProperties properties; - public ProjectBuilder(ReleaserProperties properties) { + private final VersionsFetcher versionsFetcher; + + public ProjectBuilder(ReleaserProperties properties, + VersionsFetcher versionsFetcher) { this.properties = properties; + this.versionsFetcher = versionsFetcher; } public void build(ProjectVersion versionFromReleaseTrain) { @@ -102,7 +107,7 @@ public class ProjectBuilder implements ReleaserPropertiesAware { } else if (version.isRelease() || version.isServiceRelease()) { log.info("Adding the central profile to the Maven build"); - return trimmedCommand + " -Pcentral"; + return trimmedCommand + " -Pcentral" + profilesForLatestVersion(version); } else { log.info("The build is a snapshot one - will not add any profiles"); @@ -110,6 +115,16 @@ public class ProjectBuilder implements ReleaserPropertiesAware { return trimmedCommand; } + private String profilesForLatestVersion(ProjectVersion projectVersion) { + boolean latestGa = this.versionsFetcher.isLatestGa(projectVersion); + if (latestGa) { + log.info("Version [" + projectVersion.version + + "] is the latest GA! Will append additional profiles"); + return " -Pguides"; + } + return ""; + } + private void assertNoHtmlFilesInDocsContainUnresolvedTags(String workingDir) { try { File docs = new File(workingDir, "docs"); diff --git a/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/versions/VersionsFetcher.java b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/versions/VersionsFetcher.java new file mode 100644 index 00000000..87395acc --- /dev/null +++ b/spring-cloud-release-tools-core/src/main/java/org/springframework/cloud/release/internal/versions/VersionsFetcher.java @@ -0,0 +1,187 @@ +/* + * Copyright 2013-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 org.springframework.cloud.release.internal.versions; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +import io.spring.initializr.metadata.BillOfMaterials; +import io.spring.initializr.metadata.InitializrProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.boot.context.properties.source.MapConfigurationPropertySource; +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.ReleaserPropertiesAware; +import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; +import org.springframework.cloud.release.internal.pom.ProjectVersion; +import org.springframework.cloud.release.internal.pom.Projects; +import org.springframework.core.io.InputStreamResource; +import org.springframework.util.StringUtils; + +/** + * Knows how to fetch the data related to versions. E.g. the latest release train, is this + * project's version the latest one etc. + * + * @author Marcin Grzejszczak + */ +public class VersionsFetcher implements ReleaserPropertiesAware { + + private static final Logger log = LoggerFactory.getLogger(VersionsFetcher.class); + + private ReleaserProperties properties; + + private final ProjectPomUpdater projectPomUpdater; + + private final ToPropertiesConverter toPropertiesConverter; + + public VersionsFetcher(ReleaserProperties properties, + ProjectPomUpdater projectPomUpdater) { + this.properties = properties; + this.projectPomUpdater = projectPomUpdater; + this.toPropertiesConverter = new ToPropertiesConverter(new RawGithubRetriever()); + } + + /** + * Checks if the given project version is the latest GA available. + * @param version version to check + * @return {@code true} if this version is the latest GA + */ + public boolean isLatestGa(ProjectVersion version) { + if (!version.isReleaseOrServiceRelease()) { + if (log.isDebugEnabled()) { + log.debug("Version [" + version.toString() + + "] is non GA, will not fetch any versions."); + } + return false; + } + String latestVersionsUrl = this.properties.getVersions().getAllVersionsFileUrl(); + InitializrProperties initializrProperties = this.toPropertiesConverter + .toProperties(latestVersionsUrl); + if (initializrProperties == null) { + return false; + } + ProjectVersion bomVersion = latestBomVersion(); + if (bomVersion == null) { + log.info("No BOM mapping with name [{}] found", + this.properties.getVersions().getBomName()); + return false; + } + Projects projectVersions = this.projectPomUpdater + .retrieveVersionsFromReleaseTrainBom("v" + bomVersion.toString(), false); + boolean containsProject = projectVersions.containsProject(version.projectName); + if (containsProject) { + return bomVersion.compareTo(projectVersions.forName(version.projectName)) > 0; + } + log.info("The project [" + version.projectName + + "] is not present in the BOM with projects [" + projectVersions.stream() + .map(v -> v.projectName).collect(Collectors.joining(", ")) + + "]"); + return false; + } + + private ProjectVersion latestBomVersion() { + String latestVersionsUrl = this.properties.getVersions().getAllVersionsFileUrl(); + InitializrProperties initializrProperties = this.toPropertiesConverter + .toProperties(latestVersionsUrl); + if (initializrProperties == null) { + return null; + } + ProjectVersion springCloudVersion = initializrProperties.getEnv().getBoms() + .getOrDefault( + this.properties.getVersions().getBomName(), new BillOfMaterials()) + .getMappings().stream() + .map(mapping -> new ProjectVersion( + this.properties.getVersions().getBomName(), mapping.getVersion())) + .filter(ProjectVersion::isReleaseOrServiceRelease) + .max(ProjectVersion::compareTo).orElse(new ProjectVersion( + this.properties.getVersions().getBomName(), "")); + log.info("Latest BOM version is [{}]", springCloudVersion.version); + return springCloudVersion; + } + + @Override + public void setReleaserProperties(ReleaserProperties properties) { + this.properties = properties; + } + +} + +class RawGithubRetriever { + + private static final Logger LOG = LoggerFactory.getLogger(RawGithubRetriever.class); + + String raw(String stringUrl) { + try { + URL url = new URL(stringUrl); + URLConnection con = url.openConnection(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader( + con.getInputStream(), StandardCharsets.UTF_8))) { + return reader.lines().collect(Collectors.joining("\n")); + } + } + catch (IOException e) { + LOG.warn("Exception occurred while trying to fetch the URL [" + stringUrl + + "] contents"); + return null; + } + } + +} + +class ToPropertiesConverter { + + private static final Map CACHE = new ConcurrentHashMap<>(); + + private final RawGithubRetriever rawGithubRetriever; + + ToPropertiesConverter(RawGithubRetriever rawGithubRetriever) { + this.rawGithubRetriever = rawGithubRetriever; + } + + InitializrProperties toProperties(String url) { + return CACHE.computeIfAbsent(url, s -> { + String retrievedFile = this.rawGithubRetriever.raw(s); + if (StringUtils.isEmpty(retrievedFile)) { + return null; + } + YamlPropertiesFactoryBean yamlProcessor = new YamlPropertiesFactoryBean(); + yamlProcessor.setResources(new InputStreamResource(new ByteArrayInputStream( + retrievedFile.getBytes(StandardCharsets.UTF_8)))); + Properties properties = yamlProcessor.getObject(); + return new Binder( + new MapConfigurationPropertySource(properties.entrySet().stream() + .collect(Collectors.toMap(e -> e.getKey().toString(), + e -> e.getValue().toString())))) + .bind("initializr", + InitializrProperties.class) + .get(); + }); + } + +} diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/post/PostReleaseActionsTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/post/PostReleaseActionsTests.java index 554f629e..cd355d95 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/post/PostReleaseActionsTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/post/PostReleaseActionsTests.java @@ -45,6 +45,7 @@ import org.springframework.cloud.release.internal.pom.Projects; import org.springframework.cloud.release.internal.pom.TestPomReader; import org.springframework.cloud.release.internal.pom.TestUtils; import org.springframework.cloud.release.internal.project.ProjectBuilder; +import org.springframework.cloud.release.internal.versions.VersionsFetcher; import org.springframework.util.FileSystemUtils; import org.springframework.util.LinkedMultiValueMap; @@ -91,7 +92,9 @@ public class PostReleaseActionsTests { ProjectPomUpdater updater = new ProjectPomUpdater(this.properties); - ProjectBuilder builder = new ProjectBuilder(this.properties); + VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); + + ProjectBuilder builder = new ProjectBuilder(this.properties, versionsFetcher); @Before public void setup() throws Exception { diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java index 8ba56b41..29c9d8f0 100644 --- a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/project/ProjectBuilderTests.java @@ -32,8 +32,10 @@ import org.junit.rules.TemporaryFolder; import org.springframework.boot.test.rule.OutputCapture; import org.springframework.cloud.release.internal.PomUpdateAcceptanceTests; import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; import org.springframework.cloud.release.internal.pom.ProjectVersion; import org.springframework.cloud.release.internal.pom.TestUtils; +import org.springframework.cloud.release.internal.versions.VersionsFetcher; import org.springframework.util.FileSystemUtils; import static org.assertj.core.api.BDDAssertions.then; @@ -61,7 +63,7 @@ public class ProjectBuilderTests { } ProjectBuilder projectBuilder(ReleaserProperties properties) { - return new ProjectBuilder(properties) { + return new ProjectBuilder(properties, versionsFetcher(properties)) { @Override ProcessExecutor executor(String workingDir) { return testExecutor(workingDir); @@ -123,7 +125,7 @@ public class ProjectBuilderTests { builder.build(new ProjectVersion("foo", "1.0.0.RC1")); then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pmilestone"); + .contains("foo -Pmilestone").doesNotContain("-Pguides"); } @Test @@ -137,7 +139,7 @@ public class ProjectBuilderTests { builder.build(new ProjectVersion("foo", "1.0.0.RELEASE")); then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pcentral"); + .contains("foo -Pcentral -Pguides"); } @Test @@ -278,7 +280,7 @@ public class ProjectBuilderTests { builder.deploy(new ProjectVersion("foo", "1.0.0.M1")); then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pmilestone"); + .contains("foo -Pmilestone").doesNotContain("-Pguides"); } @Test @@ -292,7 +294,7 @@ public class ProjectBuilderTests { builder.deploy(new ProjectVersion("foo", "1.0.0.RC1")); then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pmilestone"); + .contains("foo -Pmilestone").doesNotContain("-Pguides"); } @Test @@ -306,7 +308,7 @@ public class ProjectBuilderTests { builder.deploy(new ProjectVersion("foo", "1.0.0.RELEASE")); then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pcentral"); + .contains("foo -Pcentral -Pguides"); } @Test @@ -320,7 +322,7 @@ public class ProjectBuilderTests { builder.deploy(new ProjectVersion("foo", "1.0.0.SR1")); then(asString(tmpFile("/builder/resolved/resolved.log"))) - .contains("foo -Pcentral"); + .contains("foo -Pcentral -Pguides"); } @Test @@ -373,7 +375,8 @@ public class ProjectBuilderTests { properties.getMaven().setPublishDocsCommands(new String[] { "ls -al", "ls -al" }); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); TestProcessExecutor executor = testExecutor(properties.getWorkingDir()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectBuilder builder = new ProjectBuilder(properties, + versionsFetcher(properties)) { @Override ProcessExecutor executor(String workingDir) { return executor; @@ -387,6 +390,16 @@ public class ProjectBuilderTests { then(executor.counter).isEqualTo(2); } + private VersionsFetcher versionsFetcher(ReleaserProperties properties) { + ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties); + return new VersionsFetcher(properties, pomUpdater) { + @Override + public boolean isLatestGa(ProjectVersion version) { + return true; + } + }; + } + @Test public void should_successfully_execute_a_publish_docs_command_with_sys_props_placeholder() throws Exception { @@ -396,7 +409,8 @@ public class ProjectBuilderTests { properties.getMaven().setSystemProperties("-Dhello=world -Dfoo=bar"); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); TestProcessExecutor executor = testExecutor(properties.getWorkingDir()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectBuilder builder = new ProjectBuilder(properties, + versionsFetcher(properties)) { @Override ProcessExecutor executor(String workingDir) { return executor; @@ -418,7 +432,8 @@ public class ProjectBuilderTests { .setPublishDocsCommands(new String[] { "echo '{{version}}'" }); properties.setWorkingDir(tmpFile("/builder/resolved").getPath()); TestProcessExecutor executor = testExecutor(properties.getWorkingDir()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectBuilder builder = new ProjectBuilder(properties, + versionsFetcher(properties)) { @Override ProcessExecutor executor(String workingDir) { return executor; @@ -439,7 +454,8 @@ public class ProjectBuilderTests { File resolved = tmpFile("/builder/resolved"); properties.setWorkingDir(resolved.getPath()); TestProcessExecutor executor = testExecutor(properties.getWorkingDir()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectBuilder builder = new ProjectBuilder(properties, + versionsFetcher(properties)) { @Override ProcessExecutor executor(String workingDir) { return executor; @@ -470,7 +486,8 @@ public class ProjectBuilderTests { ReleaserProperties properties = new ReleaserProperties(); properties.getMaven().setBuildCommand("exit 1"); properties.setWorkingDir(tmpFile("/builder/unresolved").getPath()); - ProjectBuilder builder = new ProjectBuilder(properties) { + ProjectBuilder builder = new ProjectBuilder(properties, + versionsFetcher(properties)) { @Override ProcessExecutor executor(String workingDir) { return new ProcessExecutor(properties.getWorkingDir()) { diff --git a/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/VersionsFetcherTests.java b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/VersionsFetcherTests.java new file mode 100644 index 00000000..290d17e7 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/java/org/springframework/cloud/release/internal/versions/VersionsFetcherTests.java @@ -0,0 +1,106 @@ +/* + * Copyright 2013-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 org.springframework.cloud.release.internal.versions; + +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; + +import org.assertj.core.api.BDDAssertions; +import org.junit.jupiter.api.Test; + +import org.springframework.cloud.release.internal.ReleaserProperties; +import org.springframework.cloud.release.internal.pom.ProjectPomUpdater; +import org.springframework.cloud.release.internal.pom.ProjectVersion; + +class VersionsFetcherTests { + + @Test + void should_return_true_when_current_version_is_the_latest_ga() + throws URISyntaxException { + ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract", + "2.5.0.RELEASE"); + URI initilizrUri = VersionsFetcherTests.class.getResource("/raw/initializr.yml") + .toURI(); + ReleaserProperties properties = new ReleaserProperties(); + properties.getVersions().setAllVersionsFileUrl(initilizrUri.toString()); + properties.getGit().setReleaseTrainBomUrl( + file("/projects/spring-cloud-release/").toURI().toString()); + ProjectPomUpdater updater = new ProjectPomUpdater(properties); + VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); + + boolean latestGa = versionsFetcher.isLatestGa(projectVersion); + + BDDAssertions.then(latestGa).isTrue(); + } + + @Test + void should_return_false_when_current_version_is_not_the_latest_ga() + throws URISyntaxException { + ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract", + "1.0.0.RELEASE"); + URI initilizrUri = VersionsFetcherTests.class.getResource("/raw/initializr.yml") + .toURI(); + ReleaserProperties properties = new ReleaserProperties(); + properties.getVersions().setAllVersionsFileUrl(initilizrUri.toString()); + properties.getGit().setReleaseTrainBomUrl( + file("/projects/spring-cloud-release/").toURI().toString()); + ProjectPomUpdater updater = new ProjectPomUpdater(properties); + VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); + + boolean latestGa = versionsFetcher.isLatestGa(projectVersion); + + BDDAssertions.then(latestGa).isTrue(); + } + + @Test + void should_return_false_when_current_version_is_not_present_in_the_bom() + throws URISyntaxException { + ProjectVersion projectVersion = new ProjectVersion("spring-cloud-non-existant", + "1.0.0.RELEASE"); + URI initilizrUri = VersionsFetcherTests.class.getResource("/raw/initializr.yml") + .toURI(); + ReleaserProperties properties = new ReleaserProperties(); + properties.getVersions().setAllVersionsFileUrl(initilizrUri.toString()); + properties.getGit().setReleaseTrainBomUrl( + file("/projects/spring-cloud-release/").toURI().toString()); + ProjectPomUpdater updater = new ProjectPomUpdater(properties); + VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); + + boolean latestGa = versionsFetcher.isLatestGa(projectVersion); + + BDDAssertions.then(latestGa).isFalse(); + } + + @Test + void should_return_false_when_current_version_is_not_ga() { + ProjectVersion projectVersion = new ProjectVersion("spring-cloud-contract", + "1.0.0.BUILD-SNAPSHOT"); + ReleaserProperties properties = new ReleaserProperties(); + ProjectPomUpdater updater = new ProjectPomUpdater(properties); + VersionsFetcher versionsFetcher = new VersionsFetcher(properties, updater); + + boolean latestGa = versionsFetcher.isLatestGa(projectVersion); + + BDDAssertions.then(latestGa).isFalse(); + } + + private File file(String relativePath) throws URISyntaxException { + return new File(VersionsFetcherTests.class.getResource(relativePath).toURI()); + } + +} diff --git a/spring-cloud-release-tools-core/src/test/resources/raw/initializr.yml b/spring-cloud-release-tools-core/src/test/resources/raw/initializr.yml new file mode 100644 index 00000000..d21db668 --- /dev/null +++ b/spring-cloud-release-tools-core/src/test/resources/raw/initializr.yml @@ -0,0 +1,1266 @@ +local: + gcp: + version: 1.1.0.M3 + +logging: + level: + org.springframework.core.env: warn + org.springframework.jndi: warn + +server: + compression: + enabled: true + mime-types: application/json,text/css,text/html + min-response-size: 2048 + use-forward-headers: true + +spring: + jackson: + serialization: + write-dates-as-timestamps: false + task: + execution: + thread-name-prefix: initializr- + resources: + chain: + strategy: + content: + enabled: true + +initializr: + env: + boms: + azure: + groupId: com.microsoft.azure + artifactId: azure-spring-boot-bom + versionProperty: azure.version + mappings: + - versionRange: "[1.5.4.RELEASE,2.0.0.RELEASE)" + version: 0.2.4 + - versionRange: "[2.0.0.RELEASE,2.1.0.RELEASE)" + version: 2.0.10 + - versionRange: "2.1.0.RELEASE" + version: 2.1.2 + codecentric-spring-boot-admin: + groupId: de.codecentric + artifactId: spring-boot-admin-dependencies + versionProperty: spring-boot-admin.version + mappings: + - versionRange: "[1.5.9.RELEASE,2.0.0.M1)" + version: 1.5.7 + - versionRange: "[2.0.0.M1,2.1.0.M1)" + version: 2.0.6 + - versionRange: "[2.1.0.M1,2.2.0.M1)" + version: 2.1.4 + spring-cloud: + groupId: org.springframework.cloud + artifactId: spring-cloud-dependencies + versionProperty: spring-cloud.version + order: 50 + mappings: + - versionRange: "[1.5.0.RELEASE,1.5.x.RELEASE]" + version: Brixton.SR5 + - versionRange: "[1.5.x.BUILD-SNAPSHOT,2.0.0.M1)" + version: Brixton.BUILD-SNAPSHOT + repositories: spring-snapshots,spring-milestones + - versionRange: "[2.0.0.M3, 2.0.0.M5)" + version: Camden.M2 + repositories: spring-milestones + - versionRange: "[2.0.0.M5, 2.0.0.M5]" + version: Camden.SR4 + repositories: spring-milestones + spring-cloud-services: + groupId: io.pivotal.spring.cloud + artifactId: spring-cloud-services-dependencies + versionProperty: spring-cloud-services.version + additionalBoms: [spring-cloud] + mappings: + - versionRange: "[1.5.0.RELEASE,1.5.x.BUILD-SNAPSHOT]" + version: 1.6.6.RELEASE + - versionRange: "[2.0.0.RELEASE,2.0.x.BUILD-SNAPSHOT]" + version: 2.0.3.RELEASE + - versionRange: "2.1.0.RELEASE" + version: 2.1.2.RELEASE + spring-statemachine: + groupId: org.springframework.statemachine + artifactId: spring-statemachine-bom + versionProperty: spring-statemachine.version + mappings: + - versionRange: "[2.0.0.RC1,2.0.0.RC1]" + version: 2.0.0.M4 + repositories: spring-milestones + - versionRange: "[2.0.0.RC2,2.0.0.RC2]" + version: 2.0.0.M5 + repositories: spring-milestones + - versionRange: "2.0.0.RELEASE" + version: 2.0.1.RELEASE + vaadin: + groupId: com.vaadin + artifactId: vaadin-bom + versionProperty: vaadin.version + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + version: 8.7.2 + - versionRange: "[2.0.0.M1,2.1.0.M1)" + version: 10.0.13 + - versionRange: "2.1.0.M1" + version: 13.0.4 + gradle: + dependency-management-plugin-version: 0.6.0.RELEASE + kotlin: + default-version: 1.3.30 + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + version: 1.2.51 + - versionRange: "[2.0.0.M1,2.2.0.M1)" + version: 1.2.71 + repositories: + sonatype-snapshots: + name: Sonatype Snapshots + url: https://oss.sonatype.org/content/repositories/snapshots/ + snapshotsEnabled: true + dependencies: + - name: Core + content: + - name: DevTools + id: devtools + groupId: org.springframework.boot + artifactId: spring-boot-devtools + scope: runtime + description: Spring Boot Development Tools + versionRange: 1.3.0.RELEASE + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#using-boot-devtools + - name: Lombok + id: lombok + groupId: org.projectlombok + artifactId: lombok + scope: annotationProcessor + description: Java annotation library which helps to reduce boilerplate code and code faster + starter: false + - name: Configuration Processor + id: configuration-processor + groupId: org.springframework.boot + artifactId: spring-boot-configuration-processor + scope: annotationProcessor + description: Generate metadata for your custom configuration keys + versionRange: 1.2.0.RELEASE + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#configuration-metadata-annotation-processor + - name: Session + id: session + groupId: org.springframework.session + artifactId: spring-session-core + description: API and implementations for managing a user’s session information + starter: false + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.M2]" + artifactId: spring-session + - name: Cache + id: cache + description: Spring's Cache abstraction + links: + - rel: guide + href: https://spring.io/guides/gs/caching/ + description: Caching Data with Spring + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-caching + - name: Validation + id: validation + description: JSR-303 validation infrastructure (already included with web) + links: + - rel: guide + href: https://spring.io/guides/gs/validating-form-input/ + description: Validating Form Input + - name: Retry + id: retry + groupId: org.springframework.retry + artifactId: spring-retry + description: Provide declarative retry support via spring-retry + starter: false + - name: Aspects + id: aop + description: Create your own Aspects using Spring AOP and AspectJ + - name: Web + content: + - name: Web + id: web + description: Servlet web application with Spring MVC and Tomcat + weight: 100 + facets: + - web + - json + links: + - rel: guide + href: https://spring.io/guides/gs/rest-service/ + description: Building a RESTful Web Service + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-developing-web-applications + - rel: guide + href: https://spring.io/guides/gs/serving-web-content/ + description: Serving Web Content with Spring MVC + - rel: guide + href: https://spring.io/guides/tutorials/bookmarks/ + description: Building REST services with Spring + - name: Reactive Web + id: webflux + versionRange: 2.0.0.M1 + description: Reactive web applications with Spring WebFlux and Netty + weight: 90 + facets: + - json + - name: Rest Repositories + id: data-rest + weight: 10 + facets: + - json + description: Exposing Spring Data repositories over REST via Spring Data REST + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-rest/ + description: Accessing JPA Data with REST + - rel: guide + href: https://spring.io/guides/gs/accessing-neo4j-data-rest/ + description: Accessing Neo4j Data with REST + - rel: guide + href: https://spring.io/guides/gs/accessing-mongodb-data-rest/ + description: Accessing MongoDB Data with REST + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-use-exposing-spring-data-repositories-rest-endpoint + - name: Rest Repositories HAL Browser + id: data-rest-hal + description: Browsing Spring Data REST repositories in your browser + groupId: org.springframework.data + artifactId: spring-data-rest-hal-browser + - name: HATEOAS + id: hateoas + description: HATEOAS-based RESTful services + links: + - rel: guide + href: https://spring.io/guides/gs/rest-hateoas/ + description: Building a Hypermedia-Driven RESTful Web Service + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-hateoas + starter: false + - name: Web Services + id: web-services + description: Contract-first SOAP services with Spring Web Services + aliases: + - ws + links: + - rel: guide + href: https://spring.io/guides/gs/producing-web-service/ + description: Producing a SOAP web service + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-webservices + - name: Jersey + id: jersey + description: RESTful Web Services with JAX-RS + facets: + - json + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jersey + - name: REST Docs + id: restdocs + description: Document RESTful services by combining hand-written and auto-generated documentation + groupId: org.springframework.restdocs + artifactId: spring-restdocs-mockmvc + scope: test + - name: Vaadin + id: vaadin + facets: + - web + groupId: com.vaadin + artifactId: vaadin-spring-boot-starter + description: Vaadin java web application framework + bom: vaadin + links: + - rel: guide + href: https://spring.io/guides/gs/crud-with-vaadin/ + description: Creating CRUD UI with Vaadin + - rel: reference + href: https://vaadin.com/spring + - name: Apache CXF + id: cxf-jaxrs + groupId: org.apache.cxf + artifactId: cxf-spring-boot-starter-jaxrs + version: 3.2.5 + description: RESTful Web Services with JAX-RS + versionRange: "[1.5.0.RELEASE,2.1.0.M1)" + links: + - rel: reference + href: https://cxf.apache.org/docs/springboot.html#SpringBoot-SpringBootCXFJAX-RSStarter + - name: Ratpack + id: ratpack + description: Spring Boot integration for the Ratpack framework + groupId: io.ratpack + artifactId: ratpack-spring-boot + version: 1.1.1 + versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + starter: false + - name: Mobile + id: mobile + description: Simplify the development of mobile web applications with Spring Mobile + versionRange : "[1.5.0.RELEASE, 2.0.0.M1)" + - name: Template Engines + content: + - name: Thymeleaf + id: thymeleaf + description: Thymeleaf templating engine + weight: 90 + keywords: + - template + links: + - rel: guide + href: https://spring.io/guides/gs/handling-form-submission/ + description: Handling Form Submission + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines + - name: Freemarker + id: freemarker + description: FreeMarker templating engine + keywords: + - template + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines + - name: Mustache + id: mustache + description: Mustache templating engine + keywords: + - template + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines + - name: Groovy Templates + id: groovy-templates + description: Groovy templating engine + facets: + - web + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines + - name: Security + content: + - name: Security + id: security + description: Secure your application via spring-security + weight: 100 + links: + - rel: guide + href: https://spring.io/guides/gs/securing-web/ + description: Securing a Web Application + - rel: guide + href: https://spring.io/guides/tutorials/spring-boot-oauth2/ + description: Spring Boot and OAuth2 + - rel: guide + href: https://spring.io/guides/gs/authenticating-ldap/ + description: Authenticating a User with LDAP + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security + - name: OAuth2 Client + id: oauth2-client + description: Spring Boot integration for Spring Security's OAuth2/OpenID Connect client features + versionRange: 2.0.0.M5 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security-oauth2-client + - name: OAuth2 Resource Server + id: oauth2-resource-server + description: Spring Boot integration for Spring Security's OAuth2 resource server features + versionRange: 2.1.0.M2 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security-oauth2-server + - name: Okta + id: okta + description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features + groupId: com.okta.spring + artifactId: okta-spring-boot-starter + versionRange: 2.1.2.RELEASE + version: 1.1.0 + links: + - rel: guide + href: https://github.com/okta/samples-java-spring/tree/master/okta-hosted-login + - rel: guide + href: https://github.com/okta/samples-java-spring/tree/master/custom-login + - rel: guide + href: https://github.com/okta/samples-java-spring/tree/master/resource-server + - rel: reference + href: https://github.com/okta/okta-spring-boot/blob/master/README.md + - name: SQL + content: + - name: JPA + id: data-jpa + description: Persist data in SQL stores with Java Persistence API using Spring Data and Hibernate + weight: 100 + facets: + - jpa + aliases: + - jpa + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-jpa/ + description: Accessing Data with JPA + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jpa-and-spring-data + - name: MySQL + id: mysql + description: MySQL JDBC driver + groupId: mysql + artifactId: mysql-connector-java + scope: runtime + starter: false + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-mysql/ + description: Accessing data with MySQL + - name: H2 + id: h2 + description: H2 database (with embedded support) + groupId: com.h2database + artifactId: h2 + scope: runtime + starter: false + - name: JDBC + id: jdbc + description: Persistence support using JDBC + links: + - rel: guide + href: https://spring.io/guides/gs/relational-data-access/ + description: Accessing Relational Data using JDBC with Spring + - rel: guide + href: https://spring.io/guides/gs/managing-transactions/ + description: Managing Transactions + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-sql + - name: MyBatis + id: mybatis + description: Persistence support using MyBatis + links: + - rel: guide + href: https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start + description: Quick Start + - rel: reference + href: http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ + groupId: org.mybatis.spring.boot + artifactId: mybatis-spring-boot-starter + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.RELEASE)" + version: 1.3.4 + - versionRange: 2.0.0.RELEASE + version: 2.0.1 + - name: PostgreSQL + id: postgresql + description: PostgreSQL JDBC driver + groupId: org.postgresql + artifactId: postgresql + scope: runtime + starter: false + - name: SQL Server + id: sqlserver + description: Microsoft SQL Server JDBC driver + groupId: com.microsoft.sqlserver + artifactId: mssql-jdbc + scope: runtime + starter: false + - name: HSQLDB + id: hsql + description: HSQLDB database (with embedded support) + groupId: org.hsqldb + artifactId: hsqldb + scope: runtime + starter: false + - name: Apache Derby + id: derby + description: Apache Derby database (with embedded support) + groupId: org.apache.derby + artifactId: derby + scope: runtime + starter: false + - name: Liquibase + id: liquibase + description: Liquibase Database Migrations library + groupId: org.liquibase + artifactId: liquibase-core + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-execute-liquibase-database-migrations-on-startup + - name: Flyway + id: flyway + description: Flyway Database Migrations library + groupId: org.flywaydb + artifactId: flyway-core + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup + - name: JOOQ + id: jooq + description: Persistence support using Java Object Oriented Querying + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jooq + - name: NoSQL + content: + - name: Redis + id: data-redis + description: Access Redis key-value data stores with Spring Data Redis + aliases: + - redis + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-redis/ + description: Messaging with Redis + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-redis + - name: Reactive Redis + id: data-redis-reactive + description: Access Redis key-value data stores in a reactive fashion with Spring Data Redis + versionRange: 2.0.0.M7 + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-redis/ + description: Messaging with Redis + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-redis + - name: MongoDB + id: data-mongodb + description: Access MongoDB NoSQL Database with Spring Data MongoDB + weight: 50 + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-mongodb/ + description: Accessing Data with MongoDB + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-mongodb + - name: Reactive MongoDB + id: data-mongodb-reactive + description: Access MongoDB NoSQL Database in a reactive fashion with Spring Data MongoDB + versionRange: 2.0.0.M1 + weight: 50 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-mongodb + - name: Embedded MongoDB + id: flapdoodle-mongo + description: Embedded MongoDB for testing + groupId: de.flapdoodle.embed + artifactId: de.flapdoodle.embed.mongo + scope: test + starter: false + - name: Elasticsearch + id: data-elasticsearch + description: Elasticsearch search and analytics engine with Spring Data Elasticsearch + weight: 10 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-elasticsearch + - name: Solr + id: data-solr + description: Access Apache Solr search platform with Spring Data Solr + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-solr + - name: Cassandra + id: data-cassandra + description: Access Cassandra NoSQL Database with Spring Data Cassandra + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-cassandra + - name: Reactive Cassandra + id: data-cassandra-reactive + description: Access Cassandra NoSQL Database in a reactive fashion with Spring Data Cassandra + versionRange: 2.0.0.M1 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-cassandra + - name: Couchbase + id: data-couchbase + description: Access Couchbase NoSQL database with Spring Data Couchbase + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-couchbase + - name: Reactive Couchbase + id: data-couchbase-reactive + description: Access Couchbase NoSQL database in a reactive fashion with Spring Data Couchbase + versionRange: 2.0.0.M7 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-couchbase + - name: Neo4j + id: data-neo4j + description: Access Neo4j NoSQL graph database with Spring Data Neo4j + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-neo4j/ + description: Accessing Data with Neo4j + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-neo4j + - name: Gemfire + id: data-gemfire + description: Access GemFire distributed data store with Spring Data Gemfire + versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-gemfire/ + description: Accessing Data with GemFire + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-gemfire + - name: Messaging + content: + - name: Spring Integration + id: integration + description: Common spring-integration modules + weight: 100 + links: + - rel: guide + href: https://spring.io/guides/gs/integration/ + description: Integrating Data + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-integration + - name: RabbitMQ + id: amqp + description: Advanced Message Queuing Protocol via Spring Rabbit + weight: 100 + keywords: + - messaging + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-rabbitmq/ + description: Messaging with RabbitMQ + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-amqp + - name: Kafka + id: kafka + weight: 100 + description: Kafka messaging support using Spring Kafka + versionRange: 1.5.0.RELEASE + groupId: org.springframework.kafka + artifactId: spring-kafka + starter: false + keywords: + - messaging + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-kafka + - name: Kafka Streams + id: kafka-streams + weight: 90 + description: Building stream processing applications with Apache Kafka Streams + versionRange: 2.0.0.RELEASE + groupId: org.apache.kafka + artifactId: kafka-streams + starter: false + links: + - rel: guide + href: https://github.com/spring-cloud/spring-cloud-stream-samples/tree/master/kafka-streams-samples + description: Samples for using Kafka Streams with Spring Cloud stream + - rel: reference + href: https://docs.spring.io/spring-kafka/docs/current/reference/html/_reference.html#kafka-streams + description: Kafka Streams Support in Spring Kafka + - rel: reference + href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_kafka_streams_binding_capabilities_of_spring_cloud_stream + description: Kafka Streams Binding Capabilities of Spring Cloud Stream + - name: JMS (ActiveMQ) + id: activemq + description: Java Message Service API via Apache ActiveMQ + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-jms/ + description: Messaging with JMS + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-activemq + - name: JMS (Artemis) + id: artemis + description: Java Message Service API via Apache Artemis + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-jms/ + description: Messaging with JMS + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-artemis + - name: WebSocket + id: websocket + description: WebSocket applications with SockJS and STOMP + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-stomp-websocket/ + description: Using WebSocket to build an interactive web application + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-websockets + - name: RSocket + id: rsocket + versionRange: 2.2.0.M2 + description: RSocket.io applications with Spring Messaging and Netty + - name: Cloud Core + bom: spring-cloud + content: + - name: Cloud Bootstrap + id: cloud-starter + description: spring-cloud-context (e.g. Bootstrap context and @RefreshScope) + groupId: org.springframework.cloud + artifactId: spring-cloud-starter + weight: 100 + - name: Cloud Function + id: cloud-function + groupId: org.springframework.cloud + artifactId: spring-cloud-function-context + description: Functions as Spring Beans + versionRange: 2.0.2.RELEASE + links: + - rel: reference + href: https://cloud.spring.io/spring-cloud-function/ + - rel: sample + href: https://github.com/spring-cloud/spring-cloud-function/tree/master/spring-cloud-function-samples + description: Various sample apps using Spring Cloud Function + - name: Cloud Security + id: cloud-security + description: Secure load balancing and routing with spring-cloud-security + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-security + - name: Cloud OAuth2 + id: cloud-oauth2 + description: OAuth2 and distributed application patterns with spring-cloud-security + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-oauth2 + - name: Cloud Task + id: cloud-task + description: Task result tracking with Spring Batch and Spring Cloud Stream integrations + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-task + starter: false + - name: Cloud Support + content: + - name: Cloud Connectors + id: cloud-connectors + description: Simplifies connecting to services in cloud platforms, including spring-cloud-connector and spring-cloud-cloudfoundry-connector + - name: Open Service Broker + id: open-service-broker + description: Create service brokers that conform to the Open Service Broker API specification + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-open-service-broker-webmvc + versionRange: 2.0.0.RELEASE + version: 2.1.1.RELEASE + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-open-service-broker/docs/current/reference/html5/ + - rel: guide + href: https://github.com/spring-cloud-samples/bookstore-service-broker + description: Using Spring Cloud Open Service Broker + - name: Cloud Config + bom: spring-cloud + content: + - name: Config Client + id: cloud-config-client + description: Spring Cloud Config Client + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-config + weight: 100 + - name: Config Server + id: cloud-config-server + description: Central management for configuration via a git or svn backend + groupId: org.springframework.cloud + artifactId: spring-cloud-config-server + links: + - rel: guide + href: https://spring.io/guides/gs/centralized-configuration/ + description: Centralized Configuration + - name: Vault Configuration + id: cloud-starter-vault-config + description: Configuration management with HashiCorp Vault + versionRange: 1.5.3.RELEASE + starter: false + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-vault-config + - name: Zookeeper Configuration + id: cloud-starter-zookeeper-config + description: Configuration management with Zookeeper and spring-cloud-zookeeper-config + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-zookeeper-config + - name: Consul Configuration + id: cloud-starter-consul-config + description: Configuration management with Hashicorp Consul + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-consul-config + - name: Cloud Discovery + bom: spring-cloud + content: + - name: Eureka Discovery + id: cloud-eureka + description: Service discovery using spring-cloud-netflix and Eureka + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-eureka-client + weight: 100 + - name: Eureka Server + id: cloud-eureka-server + description: spring-cloud-netflix Eureka Server + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-eureka-server + links: + - rel: guide + href: https://spring.io/guides/gs/service-registration-and-discovery/ + description: Service Registration and Discovery + - name: Zookeeper Discovery + id: cloud-starter-zookeeper-discovery + description: Service discovery with Zookeeper and spring-cloud-zookeeper-discovery + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-zookeeper-discovery + - name: Cloud Foundry Discovery + id: cloud-cloudfoundry-discovery + description: Service discovery with Cloud Foundry + groupId: org.springframework.cloud + artifactId: spring-cloud-cloudfoundry-discovery + - name: Consul Discovery + id: cloud-starter-consul-discovery + description: Service discovery with Hashicorp Consul + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-consul-discovery + - name: Cloud Routing + bom: spring-cloud + content: + - name: Zuul + id: cloud-zuul + description: Intelligent and programmable routing with spring-cloud-netflix Zuul + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-zuul + links: + - rel: guide + href: https://spring.io/guides/gs/routing-and-filtering/ + description: Routing and Filtering + - name: Gateway + id: cloud-gateway + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway + description: Intelligent and programmable routing with the reactive Spring Cloud Gateway + versionRange: 2.0.0.M5 + links: + - rel: guide + href: https://github.com/spring-cloud-samples/spring-cloud-gateway-sample + description: Using Spring Cloud Gateway + - name: Ribbon + id: cloud-ribbon + description: Client side load balancing with spring-cloud-netflix and Ribbon + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-ribbon + links: + - rel: guide + href: https://spring.io/guides/gs/client-side-load-balancing/ + description: Client Side Load Balancing with Ribbon and Spring Cloud + - name: Feign + id: cloud-feign + description: Declarative REST clients with spring-cloud-netflix Feign + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-openfeign + - name: Cloud Circuit Breaker + bom: spring-cloud + content: + - name: Hystrix + id: cloud-hystrix + description: Circuit breaker with spring-cloud-netflix Hystrix + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-hystrix + links: + - rel: guide + href: https://spring.io/guides/gs/circuit-breaker/ + description: Circuit Breaker + - name: Hystrix Dashboard + id: cloud-hystrix-dashboard + description: Circuit breaker dashboard with spring-cloud-netflix Hystrix + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-hystrix-dashboard + - name: Turbine + id: cloud-turbine + description: Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and server-sent events + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-turbine + - name: Turbine Stream + id: cloud-turbine-stream + description: Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and Spring Cloud Stream (requires a binder, e.g. Kafka or RabbitMQ) + versionRange: 1.3.0.RELEASE + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-turbine-stream + weight: -1 + - name: Cloud Tracing + bom: spring-cloud + content: + - name: Sleuth + id: cloud-starter-sleuth + description: Distributed tracing via logs with spring-cloud-sleuth + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-sleuth + - name: Zipkin Client + id: cloud-starter-zipkin + description: Distributed tracing with an existing Zipkin installation and spring-cloud-sleuth-zipkin. Alternatively, consider Sleuth Stream. + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-zipkin + - name: Cloud Messaging + bom: spring-cloud + content: + - name: Cloud Bus + id: cloud-bus + description: A simple control bus using Spring Cloud Stream (requires a binder, e.g. Kafka or RabbitMQ) + groupId: org.springframework.cloud + artifactId: spring-cloud-bus + - name: Cloud Stream + id: cloud-stream + description: Messaging microservices with Spring Cloud Stream (requires a binder, e.g. Kafka or RabbitMQ) + weight: 90 + groupId: org.springframework.cloud + artifactId: spring-cloud-stream + - name: Reactive Cloud Stream + id: reactive-cloud-stream + description: Reactive messaging microservices with Spring Cloud Stream (requires a binder, e.g. Kafka or RabbitMQ) + versionRange: 2.0.0.RC2 + weight: 90 + groupId: org.springframework.cloud + artifactId: spring-cloud-stream-reactive + - name: Cloud Contract + bom: spring-cloud + content: + - name: Cloud Contract Verifier + id: cloud-contract-verifier + description: Test dependencies required for autogenerated tests + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-contract-verifier + scope: test + starter: false + - name: Cloud Contract Stub Runner + id: cloud-contract-stub-runner + description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-contract-stub-runner + scope: test + starter: false + - name: Pivotal Cloud Foundry + bom: spring-cloud-services + content: + - name: Config Client (PCF) + id: scs-config-client + description: Config client on Pivotal Cloud Foundry + groupId: io.pivotal.spring.cloud + artifactId: spring-cloud-services-starter-config-client + links: + - rel: reference + href: https://docs.pivotal.io/spring-cloud-services/ + description: Reference doc + - name: Service Registry Client (PCF) + id: scs-service-registry + description: Eureka service discovery client on Pivotal Cloud Foundry + groupId: io.pivotal.spring.cloud + artifactId: spring-cloud-services-starter-service-registry + links: + - rel: reference + href: https://docs.pivotal.io/spring-cloud-services/ + description: Reference doc + - name: Circuit Breaker Client (PCF) + id: scs-circuit-breaker + description: Hystrix circuit breaker client on Pivotal Cloud Foundry + groupId: io.pivotal.spring.cloud + artifactId: spring-cloud-services-starter-circuit-breaker + links: + - rel: reference + href: https://docs.pivotal.io/spring-cloud-services/ + description: Reference doc + - name: Amazon Web Services + bom: spring-cloud + content: + - name: AWS Core + id: cloud-aws + description: AWS native services from spring-cloud-aws + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-aws + - name: AWS JDBC + id: cloud-aws-jdbc + description: Relational databases on AWS with RDS and spring-cloud-aws-jdbc + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-aws-jdbc + - name: AWS Messaging + id: cloud-aws-messaging + description: Messaging on AWS with SQS and spring-cloud-aws-messaging + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-aws-messaging + - name: Azure + bom: azure + versionRange: "1.5.4.RELEASE" + content: + - name: Azure Support + id: azure-support + groupId: com.microsoft.azure + artifactId: azure-spring-boot-starter + description: Auto-configuration for Azure Services (service bus, storage, active directory, cosmos DB, key vault and more) + links: + - rel: reference + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot + description: Reference doc + - name: Azure Active Directory + id: azure-active-directory + groupId: com.microsoft.azure + artifactId: azure-active-directory-spring-boot-starter + description: Spring Security integration with Azure Active Directory for authentication + links: + - rel: guide + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-active-directory-spring-boot-sample + description: Using Active Directory + - rel: reference + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-active-directory-spring-boot-starter + description: Reference doc + - name: Azure Key Vault + id: azure-keyvault-secrets + groupId: com.microsoft.azure + artifactId: azure-keyvault-secrets-spring-boot-starter + description: Spring value annotation integration with Azure Key Vault Secrets + links: + - rel: guide + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-keyvault-secrets-spring-boot-sample + description: Using Key Vault + - rel: reference + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-keyvault-secrets-spring-boot-starter + description: Reference doc + - name: Azure Storage + id: azure-storage + groupId: com.microsoft.azure + artifactId: azure-storage-spring-boot-starter + description: Azure Storage service integration + links: + - rel: guide + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-storage-spring-boot-sample + description: Using Azure Storage + - rel: reference + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-storage-spring-boot-starter + description: Reference doc + - name: Google Cloud Platform + bom: spring-cloud + versionRange: 2.0.0.RELEASE + content: + - name: GCP Support + id: cloud-gcp + description: Support for Google Cloud Platform services + groupId: org.springframework.cloud + artifactId: spring-cloud-gcp-starter + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-gcp/docs/${local.gcp.version}/reference/htmlsingle/ + description: Reference doc + - rel: guide + href: https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples + description: Samples + - name: GCP Messaging + id: cloud-gcp-pubsub + description: Publish to and subcribe from Google Cloud Pub/Sub topics + groupId: org.springframework.cloud + artifactId: spring-cloud-gcp-starter-pubsub + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-gcp/docs/${local.gcp.version}/reference/htmlsingle/#_spring_cloud_gcp_for_pub_sub + description: Reference doc + - rel: guide + href: https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-sample + description: Sample + - name: GCP Storage + id: cloud-gcp-storage + description: Access Google Cloud Storage objects + groupId: org.springframework.cloud + artifactId: spring-cloud-gcp-starter-storage + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-gcp/docs/${local.gcp.version}/reference/htmlsingle/#_spring_resources + description: Reference doc + - rel: guide + href: https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample + description: Sample + - name: I/O + content: + - name: Batch + id: batch + description: Spring Batch support + weight: 100 + links: + - rel: guide + href: https://spring.io/guides/gs/batch-processing/ + description: Creating a Batch Service + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-batch-applications + - name: Mail + id: mail + description: Send email using Java Mail and Spring Framework's JavaMailSender + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-email + - name: Apache Camel + id: camel + versionRange: "1.5.0.RELEASE" + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + version: 2.21.5 + - versionRange: "[2.0.0.M1,2.1.0.M1)" + version: 2.22.4 + - versionRange: "2.1.0.M1" + version: 2.23.2 + description: Integration using Apache Camel + groupId: org.apache.camel + artifactId: camel-spring-boot-starter + links: + - rel: guide + href: https://camel.apache.org/spring-boot + description: Using Apache Camel with Spring Boot + - name: LDAP + id: data-ldap + description: LDAP support, including spring-data-ldap + versionRange: 1.5.0.RELEASE + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-ldap + - name: Quartz Scheduler + id: quartz + versionRange: 2.0.0.M2 + description: Schedule jobs using Quartz + - name: Spring Shell + id: spring-shell + groupId: org.springframework.shell + artifactId: spring-shell-starter + description: Build shell-based clients + version: 2.0.0.RELEASE + repository: spring-milestones + links: + - rel: reference + href: https://docs.spring.io/spring-shell/docs/2.0.0.M2/reference/htmlsingle/ + - name: Statemachine + id: statemachine + groupId: org.springframework.statemachine + artifactId: spring-statemachine-starter + description: Build applications using state machine concepts + versionRange: 2.0.0.RC1 + bom: spring-statemachine + links: + - rel: reference + href: https://docs.spring.io/spring-statemachine/docs/current-SNAPSHOT/reference/htmlsingle/ + - rel: guide + href: https://docs.spring.io/spring-statemachine/docs/current-SNAPSHOT/reference/htmlsingle/#developing-your-first-spring-statemachine-application + description: Developing your first Spring Statemachine application + - name: Ops + content: + - name: Actuator + id: actuator + description: Production ready features to help you monitor and manage your application + links: + - rel: guide + href: https://spring.io/guides/gs/actuator-service/ + description: Building a RESTful Web Service with Spring Boot Actuator + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#production-ready + - name: Spring Boot Admin (Server) + id: codecentric-spring-boot-admin-server + groupId: de.codecentric + artifactId: spring-boot-admin-starter-server + description: An admin interface for Spring Boot applications + versionRange: "[1.5.9.RELEASE,2.2.0.M1)" + bom: codecentric-spring-boot-admin + links: + - rel: reference + href: https://codecentric.github.io/spring-boot-admin/current/#getting-started + - name: Spring Boot Admin (Client) + id: codecentric-spring-boot-admin-client + groupId: de.codecentric + artifactId: spring-boot-admin-starter-client + description: Register your application with a Spring Boot Admin instance + versionRange: "[1.5.9.RELEASE,2.2.0.M1)" + bom: codecentric-spring-boot-admin + links: + - rel: reference + href: https://codecentric.github.io/spring-boot-admin/current/#getting-started + - name: Actuator Docs + id: actuator-docs + description: API documentation for the Actuator endpoints + versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + groupId: org.springframework.boot + artifactId: spring-boot-actuator-docs + types: + - name: Maven Project + id: maven-project + description: Generate a Maven based project archive + tags: + build: maven + format: project + default: true + action: /starter.zip + - name: Maven POM + id: maven-build + description: Generate a Maven pom.xml + tags: + build: maven + format: build + default: false + action: /pom.xml + - name: Gradle Project + id: gradle-project + description: Generate a Gradle based project archive + tags: + build: gradle + format: project + default: false + action: /starter.zip + - name: Gradle Config + id: gradle-build + description: Generate a Gradle build file + tags: + build: gradle + format: build + default: false + action: /build.gradle + packagings: + - name: Jar + id: jar + default: true + - name: War + id: war + default: false + javaVersions: + - id: 12 + default: false + - id: 11 + default: false + - id: 1.8 + name: 8 + default: true + languages: + - name: Java + id: java + default: true + - name: Kotlin + id: kotlin + default: false + - name: Groovy + id: groovy + default: false + bootVersions: + - name : Latest SNAPSHOT + id: 2.2.0.BUILD-SNAPSHOT + default: false + - name : 2.1.1. + id: 2.1.1.RELEASE + default: true + +--- + +spring: + profiles: dev + resources: + static_locations: + - file:start-client/build/ + chain: + strategy: + content: + enabled: false + devtools: + restart: + additional_paths: + - start-client/build/ + additional_exclude: "**/*.js,**/*.css" + diff --git a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/ReleaserConfiguration.java b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/ReleaserConfiguration.java index 29ed45ad..464c7d6c 100644 --- a/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/ReleaserConfiguration.java +++ b/spring-cloud-release-tools-spring/src/main/java/org/springframework/cloud/release/internal/spring/ReleaserConfiguration.java @@ -30,6 +30,7 @@ import org.springframework.cloud.release.internal.project.ProjectBuilder; import org.springframework.cloud.release.internal.sagan.SaganClient; import org.springframework.cloud.release.internal.sagan.SaganUpdater; import org.springframework.cloud.release.internal.template.TemplateGenerator; +import org.springframework.cloud.release.internal.versions.VersionsFetcher; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; @@ -55,8 +56,8 @@ class ReleaserConfiguration { } @Bean - ProjectBuilder projectBuilder() { - return new ProjectBuilder(this.properties); + ProjectBuilder projectBuilder(VersionsFetcher versionsFetcher) { + return new ProjectBuilder(this.properties, versionsFetcher); } @Bean @@ -64,6 +65,11 @@ class ReleaserConfiguration { return new ProjectPomUpdater(this.properties); } + @Bean + VersionsFetcher versionsFetcher(ProjectPomUpdater updater) { + return new VersionsFetcher(this.properties, updater); + } + @Bean ProjectGitHandler projectGitHandler() { return new ProjectGitHandler(this.properties); diff --git a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java index 24090865..61e71036 100644 --- a/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java +++ b/spring-cloud-release-tools-spring/src/test/java/org/springframework/cloud/release/internal/spring/AcceptanceTests.java @@ -18,6 +18,7 @@ package org.springframework.cloud.release.internal.spring; import java.io.File; import java.io.IOException; +import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Files; import java.util.ArrayList; @@ -64,6 +65,7 @@ import org.springframework.cloud.release.internal.sagan.Release; import org.springframework.cloud.release.internal.sagan.SaganClient; import org.springframework.cloud.release.internal.sagan.SaganUpdater; import org.springframework.cloud.release.internal.template.TemplateGenerator; +import org.springframework.cloud.release.internal.versions.VersionsFetcher; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEventPublisher; import org.springframework.util.FileSystemUtils; @@ -694,7 +696,8 @@ public class AcceptanceTests { private Releaser defaultReleaser(String expectedVersion, String projectName, ReleaserProperties properties) { ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties); - ProjectBuilder projectBuilder = new ProjectBuilder(properties); + VersionsFetcher versionsFetcher = new VersionsFetcher(properties, pomUpdater); + ProjectBuilder projectBuilder = new ProjectBuilder(properties, versionsFetcher); TestProjectGitHandler handler = new TestProjectGitHandler(properties, expectedVersion, projectName); TemplateGenerator templateGenerator = new TemplateGenerator(properties, handler); @@ -724,7 +727,8 @@ public class AcceptanceTests { private Releaser defaultMetaReleaser(ReleaserProperties properties) { ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties); - ProjectBuilder projectBuilder = new ProjectBuilder(properties); + VersionsFetcher versionsFetcher = new VersionsFetcher(properties, pomUpdater); + ProjectBuilder projectBuilder = new ProjectBuilder(properties, versionsFetcher); NonAssertingTestProjectGitHandler handler = new NonAssertingTestProjectGitHandler( properties); TemplateGenerator templateGenerator = Mockito @@ -781,6 +785,9 @@ public class AcceptanceTests { .setSpringProjectUrl(tmpFile("spring-cloud").getAbsolutePath() + "/"); releaserProperties.getGit().setReleaseTrainWikiUrl( tmpFile("spring-cloud-wiki").getAbsolutePath() + "/"); + URI initilizrUri = AcceptanceTests.class.getResource("/raw/initializr.yml") + .toURI(); + releaserProperties.getVersions().setAllVersionsFileUrl(initilizrUri.toString()); this.releaserProperties = releaserProperties; return releaserProperties; } @@ -810,6 +817,9 @@ public class AcceptanceTests { releaserProperties.getGit().setReleaseTrainWikiUrl( tmpFile("spring-cloud-wiki").getAbsolutePath() + "/"); releaserProperties.setFixedVersions(versions); + URI initilizrUri = AcceptanceTests.class.getResource("/raw/initializr.yml") + .toURI(); + releaserProperties.getVersions().setAllVersionsFileUrl(initilizrUri.toString()); this.releaserProperties = releaserProperties; return releaserProperties; } @@ -821,6 +831,9 @@ public class AcceptanceTests { file("/projects/spring-cloud-release-with-snapshot/").toURI().toString()); releaserProperties.getGit().setDocumentationUrl( file("/projects/spring-cloud-static/").toURI().toString()); + URI initilizrUri = AcceptanceTests.class.getResource("/raw/initializr.yml") + .toURI(); + releaserProperties.getVersions().setAllVersionsFileUrl(initilizrUri.toString()); this.releaserProperties = releaserProperties; return releaserProperties; } diff --git a/spring-cloud-release-tools-spring/src/test/resources/raw/initializr.yml b/spring-cloud-release-tools-spring/src/test/resources/raw/initializr.yml new file mode 100644 index 00000000..d21db668 --- /dev/null +++ b/spring-cloud-release-tools-spring/src/test/resources/raw/initializr.yml @@ -0,0 +1,1266 @@ +local: + gcp: + version: 1.1.0.M3 + +logging: + level: + org.springframework.core.env: warn + org.springframework.jndi: warn + +server: + compression: + enabled: true + mime-types: application/json,text/css,text/html + min-response-size: 2048 + use-forward-headers: true + +spring: + jackson: + serialization: + write-dates-as-timestamps: false + task: + execution: + thread-name-prefix: initializr- + resources: + chain: + strategy: + content: + enabled: true + +initializr: + env: + boms: + azure: + groupId: com.microsoft.azure + artifactId: azure-spring-boot-bom + versionProperty: azure.version + mappings: + - versionRange: "[1.5.4.RELEASE,2.0.0.RELEASE)" + version: 0.2.4 + - versionRange: "[2.0.0.RELEASE,2.1.0.RELEASE)" + version: 2.0.10 + - versionRange: "2.1.0.RELEASE" + version: 2.1.2 + codecentric-spring-boot-admin: + groupId: de.codecentric + artifactId: spring-boot-admin-dependencies + versionProperty: spring-boot-admin.version + mappings: + - versionRange: "[1.5.9.RELEASE,2.0.0.M1)" + version: 1.5.7 + - versionRange: "[2.0.0.M1,2.1.0.M1)" + version: 2.0.6 + - versionRange: "[2.1.0.M1,2.2.0.M1)" + version: 2.1.4 + spring-cloud: + groupId: org.springframework.cloud + artifactId: spring-cloud-dependencies + versionProperty: spring-cloud.version + order: 50 + mappings: + - versionRange: "[1.5.0.RELEASE,1.5.x.RELEASE]" + version: Brixton.SR5 + - versionRange: "[1.5.x.BUILD-SNAPSHOT,2.0.0.M1)" + version: Brixton.BUILD-SNAPSHOT + repositories: spring-snapshots,spring-milestones + - versionRange: "[2.0.0.M3, 2.0.0.M5)" + version: Camden.M2 + repositories: spring-milestones + - versionRange: "[2.0.0.M5, 2.0.0.M5]" + version: Camden.SR4 + repositories: spring-milestones + spring-cloud-services: + groupId: io.pivotal.spring.cloud + artifactId: spring-cloud-services-dependencies + versionProperty: spring-cloud-services.version + additionalBoms: [spring-cloud] + mappings: + - versionRange: "[1.5.0.RELEASE,1.5.x.BUILD-SNAPSHOT]" + version: 1.6.6.RELEASE + - versionRange: "[2.0.0.RELEASE,2.0.x.BUILD-SNAPSHOT]" + version: 2.0.3.RELEASE + - versionRange: "2.1.0.RELEASE" + version: 2.1.2.RELEASE + spring-statemachine: + groupId: org.springframework.statemachine + artifactId: spring-statemachine-bom + versionProperty: spring-statemachine.version + mappings: + - versionRange: "[2.0.0.RC1,2.0.0.RC1]" + version: 2.0.0.M4 + repositories: spring-milestones + - versionRange: "[2.0.0.RC2,2.0.0.RC2]" + version: 2.0.0.M5 + repositories: spring-milestones + - versionRange: "2.0.0.RELEASE" + version: 2.0.1.RELEASE + vaadin: + groupId: com.vaadin + artifactId: vaadin-bom + versionProperty: vaadin.version + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + version: 8.7.2 + - versionRange: "[2.0.0.M1,2.1.0.M1)" + version: 10.0.13 + - versionRange: "2.1.0.M1" + version: 13.0.4 + gradle: + dependency-management-plugin-version: 0.6.0.RELEASE + kotlin: + default-version: 1.3.30 + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + version: 1.2.51 + - versionRange: "[2.0.0.M1,2.2.0.M1)" + version: 1.2.71 + repositories: + sonatype-snapshots: + name: Sonatype Snapshots + url: https://oss.sonatype.org/content/repositories/snapshots/ + snapshotsEnabled: true + dependencies: + - name: Core + content: + - name: DevTools + id: devtools + groupId: org.springframework.boot + artifactId: spring-boot-devtools + scope: runtime + description: Spring Boot Development Tools + versionRange: 1.3.0.RELEASE + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#using-boot-devtools + - name: Lombok + id: lombok + groupId: org.projectlombok + artifactId: lombok + scope: annotationProcessor + description: Java annotation library which helps to reduce boilerplate code and code faster + starter: false + - name: Configuration Processor + id: configuration-processor + groupId: org.springframework.boot + artifactId: spring-boot-configuration-processor + scope: annotationProcessor + description: Generate metadata for your custom configuration keys + versionRange: 1.2.0.RELEASE + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#configuration-metadata-annotation-processor + - name: Session + id: session + groupId: org.springframework.session + artifactId: spring-session-core + description: API and implementations for managing a user’s session information + starter: false + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.M2]" + artifactId: spring-session + - name: Cache + id: cache + description: Spring's Cache abstraction + links: + - rel: guide + href: https://spring.io/guides/gs/caching/ + description: Caching Data with Spring + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-caching + - name: Validation + id: validation + description: JSR-303 validation infrastructure (already included with web) + links: + - rel: guide + href: https://spring.io/guides/gs/validating-form-input/ + description: Validating Form Input + - name: Retry + id: retry + groupId: org.springframework.retry + artifactId: spring-retry + description: Provide declarative retry support via spring-retry + starter: false + - name: Aspects + id: aop + description: Create your own Aspects using Spring AOP and AspectJ + - name: Web + content: + - name: Web + id: web + description: Servlet web application with Spring MVC and Tomcat + weight: 100 + facets: + - web + - json + links: + - rel: guide + href: https://spring.io/guides/gs/rest-service/ + description: Building a RESTful Web Service + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-developing-web-applications + - rel: guide + href: https://spring.io/guides/gs/serving-web-content/ + description: Serving Web Content with Spring MVC + - rel: guide + href: https://spring.io/guides/tutorials/bookmarks/ + description: Building REST services with Spring + - name: Reactive Web + id: webflux + versionRange: 2.0.0.M1 + description: Reactive web applications with Spring WebFlux and Netty + weight: 90 + facets: + - json + - name: Rest Repositories + id: data-rest + weight: 10 + facets: + - json + description: Exposing Spring Data repositories over REST via Spring Data REST + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-rest/ + description: Accessing JPA Data with REST + - rel: guide + href: https://spring.io/guides/gs/accessing-neo4j-data-rest/ + description: Accessing Neo4j Data with REST + - rel: guide + href: https://spring.io/guides/gs/accessing-mongodb-data-rest/ + description: Accessing MongoDB Data with REST + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-use-exposing-spring-data-repositories-rest-endpoint + - name: Rest Repositories HAL Browser + id: data-rest-hal + description: Browsing Spring Data REST repositories in your browser + groupId: org.springframework.data + artifactId: spring-data-rest-hal-browser + - name: HATEOAS + id: hateoas + description: HATEOAS-based RESTful services + links: + - rel: guide + href: https://spring.io/guides/gs/rest-hateoas/ + description: Building a Hypermedia-Driven RESTful Web Service + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-hateoas + starter: false + - name: Web Services + id: web-services + description: Contract-first SOAP services with Spring Web Services + aliases: + - ws + links: + - rel: guide + href: https://spring.io/guides/gs/producing-web-service/ + description: Producing a SOAP web service + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-webservices + - name: Jersey + id: jersey + description: RESTful Web Services with JAX-RS + facets: + - json + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jersey + - name: REST Docs + id: restdocs + description: Document RESTful services by combining hand-written and auto-generated documentation + groupId: org.springframework.restdocs + artifactId: spring-restdocs-mockmvc + scope: test + - name: Vaadin + id: vaadin + facets: + - web + groupId: com.vaadin + artifactId: vaadin-spring-boot-starter + description: Vaadin java web application framework + bom: vaadin + links: + - rel: guide + href: https://spring.io/guides/gs/crud-with-vaadin/ + description: Creating CRUD UI with Vaadin + - rel: reference + href: https://vaadin.com/spring + - name: Apache CXF + id: cxf-jaxrs + groupId: org.apache.cxf + artifactId: cxf-spring-boot-starter-jaxrs + version: 3.2.5 + description: RESTful Web Services with JAX-RS + versionRange: "[1.5.0.RELEASE,2.1.0.M1)" + links: + - rel: reference + href: https://cxf.apache.org/docs/springboot.html#SpringBoot-SpringBootCXFJAX-RSStarter + - name: Ratpack + id: ratpack + description: Spring Boot integration for the Ratpack framework + groupId: io.ratpack + artifactId: ratpack-spring-boot + version: 1.1.1 + versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + starter: false + - name: Mobile + id: mobile + description: Simplify the development of mobile web applications with Spring Mobile + versionRange : "[1.5.0.RELEASE, 2.0.0.M1)" + - name: Template Engines + content: + - name: Thymeleaf + id: thymeleaf + description: Thymeleaf templating engine + weight: 90 + keywords: + - template + links: + - rel: guide + href: https://spring.io/guides/gs/handling-form-submission/ + description: Handling Form Submission + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines + - name: Freemarker + id: freemarker + description: FreeMarker templating engine + keywords: + - template + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines + - name: Mustache + id: mustache + description: Mustache templating engine + keywords: + - template + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines + - name: Groovy Templates + id: groovy-templates + description: Groovy templating engine + facets: + - web + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-spring-mvc-template-engines + - name: Security + content: + - name: Security + id: security + description: Secure your application via spring-security + weight: 100 + links: + - rel: guide + href: https://spring.io/guides/gs/securing-web/ + description: Securing a Web Application + - rel: guide + href: https://spring.io/guides/tutorials/spring-boot-oauth2/ + description: Spring Boot and OAuth2 + - rel: guide + href: https://spring.io/guides/gs/authenticating-ldap/ + description: Authenticating a User with LDAP + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security + - name: OAuth2 Client + id: oauth2-client + description: Spring Boot integration for Spring Security's OAuth2/OpenID Connect client features + versionRange: 2.0.0.M5 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security-oauth2-client + - name: OAuth2 Resource Server + id: oauth2-resource-server + description: Spring Boot integration for Spring Security's OAuth2 resource server features + versionRange: 2.1.0.M2 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-security-oauth2-server + - name: Okta + id: okta + description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features + groupId: com.okta.spring + artifactId: okta-spring-boot-starter + versionRange: 2.1.2.RELEASE + version: 1.1.0 + links: + - rel: guide + href: https://github.com/okta/samples-java-spring/tree/master/okta-hosted-login + - rel: guide + href: https://github.com/okta/samples-java-spring/tree/master/custom-login + - rel: guide + href: https://github.com/okta/samples-java-spring/tree/master/resource-server + - rel: reference + href: https://github.com/okta/okta-spring-boot/blob/master/README.md + - name: SQL + content: + - name: JPA + id: data-jpa + description: Persist data in SQL stores with Java Persistence API using Spring Data and Hibernate + weight: 100 + facets: + - jpa + aliases: + - jpa + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-jpa/ + description: Accessing Data with JPA + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jpa-and-spring-data + - name: MySQL + id: mysql + description: MySQL JDBC driver + groupId: mysql + artifactId: mysql-connector-java + scope: runtime + starter: false + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-mysql/ + description: Accessing data with MySQL + - name: H2 + id: h2 + description: H2 database (with embedded support) + groupId: com.h2database + artifactId: h2 + scope: runtime + starter: false + - name: JDBC + id: jdbc + description: Persistence support using JDBC + links: + - rel: guide + href: https://spring.io/guides/gs/relational-data-access/ + description: Accessing Relational Data using JDBC with Spring + - rel: guide + href: https://spring.io/guides/gs/managing-transactions/ + description: Managing Transactions + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-sql + - name: MyBatis + id: mybatis + description: Persistence support using MyBatis + links: + - rel: guide + href: https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start + description: Quick Start + - rel: reference + href: http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ + groupId: org.mybatis.spring.boot + artifactId: mybatis-spring-boot-starter + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.RELEASE)" + version: 1.3.4 + - versionRange: 2.0.0.RELEASE + version: 2.0.1 + - name: PostgreSQL + id: postgresql + description: PostgreSQL JDBC driver + groupId: org.postgresql + artifactId: postgresql + scope: runtime + starter: false + - name: SQL Server + id: sqlserver + description: Microsoft SQL Server JDBC driver + groupId: com.microsoft.sqlserver + artifactId: mssql-jdbc + scope: runtime + starter: false + - name: HSQLDB + id: hsql + description: HSQLDB database (with embedded support) + groupId: org.hsqldb + artifactId: hsqldb + scope: runtime + starter: false + - name: Apache Derby + id: derby + description: Apache Derby database (with embedded support) + groupId: org.apache.derby + artifactId: derby + scope: runtime + starter: false + - name: Liquibase + id: liquibase + description: Liquibase Database Migrations library + groupId: org.liquibase + artifactId: liquibase-core + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-execute-liquibase-database-migrations-on-startup + - name: Flyway + id: flyway + description: Flyway Database Migrations library + groupId: org.flywaydb + artifactId: flyway-core + starter: false + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup + - name: JOOQ + id: jooq + description: Persistence support using Java Object Oriented Querying + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-jooq + - name: NoSQL + content: + - name: Redis + id: data-redis + description: Access Redis key-value data stores with Spring Data Redis + aliases: + - redis + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-redis/ + description: Messaging with Redis + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-redis + - name: Reactive Redis + id: data-redis-reactive + description: Access Redis key-value data stores in a reactive fashion with Spring Data Redis + versionRange: 2.0.0.M7 + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-redis/ + description: Messaging with Redis + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-redis + - name: MongoDB + id: data-mongodb + description: Access MongoDB NoSQL Database with Spring Data MongoDB + weight: 50 + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-mongodb/ + description: Accessing Data with MongoDB + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-mongodb + - name: Reactive MongoDB + id: data-mongodb-reactive + description: Access MongoDB NoSQL Database in a reactive fashion with Spring Data MongoDB + versionRange: 2.0.0.M1 + weight: 50 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-mongodb + - name: Embedded MongoDB + id: flapdoodle-mongo + description: Embedded MongoDB for testing + groupId: de.flapdoodle.embed + artifactId: de.flapdoodle.embed.mongo + scope: test + starter: false + - name: Elasticsearch + id: data-elasticsearch + description: Elasticsearch search and analytics engine with Spring Data Elasticsearch + weight: 10 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-elasticsearch + - name: Solr + id: data-solr + description: Access Apache Solr search platform with Spring Data Solr + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-solr + - name: Cassandra + id: data-cassandra + description: Access Cassandra NoSQL Database with Spring Data Cassandra + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-cassandra + - name: Reactive Cassandra + id: data-cassandra-reactive + description: Access Cassandra NoSQL Database in a reactive fashion with Spring Data Cassandra + versionRange: 2.0.0.M1 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-cassandra + - name: Couchbase + id: data-couchbase + description: Access Couchbase NoSQL database with Spring Data Couchbase + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-couchbase + - name: Reactive Couchbase + id: data-couchbase-reactive + description: Access Couchbase NoSQL database in a reactive fashion with Spring Data Couchbase + versionRange: 2.0.0.M7 + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-couchbase + - name: Neo4j + id: data-neo4j + description: Access Neo4j NoSQL graph database with Spring Data Neo4j + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-neo4j/ + description: Accessing Data with Neo4j + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-neo4j + - name: Gemfire + id: data-gemfire + description: Access GemFire distributed data store with Spring Data Gemfire + versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + links: + - rel: guide + href: https://spring.io/guides/gs/accessing-data-gemfire/ + description: Accessing Data with GemFire + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-gemfire + - name: Messaging + content: + - name: Spring Integration + id: integration + description: Common spring-integration modules + weight: 100 + links: + - rel: guide + href: https://spring.io/guides/gs/integration/ + description: Integrating Data + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-integration + - name: RabbitMQ + id: amqp + description: Advanced Message Queuing Protocol via Spring Rabbit + weight: 100 + keywords: + - messaging + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-rabbitmq/ + description: Messaging with RabbitMQ + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-amqp + - name: Kafka + id: kafka + weight: 100 + description: Kafka messaging support using Spring Kafka + versionRange: 1.5.0.RELEASE + groupId: org.springframework.kafka + artifactId: spring-kafka + starter: false + keywords: + - messaging + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-kafka + - name: Kafka Streams + id: kafka-streams + weight: 90 + description: Building stream processing applications with Apache Kafka Streams + versionRange: 2.0.0.RELEASE + groupId: org.apache.kafka + artifactId: kafka-streams + starter: false + links: + - rel: guide + href: https://github.com/spring-cloud/spring-cloud-stream-samples/tree/master/kafka-streams-samples + description: Samples for using Kafka Streams with Spring Cloud stream + - rel: reference + href: https://docs.spring.io/spring-kafka/docs/current/reference/html/_reference.html#kafka-streams + description: Kafka Streams Support in Spring Kafka + - rel: reference + href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_kafka_streams_binding_capabilities_of_spring_cloud_stream + description: Kafka Streams Binding Capabilities of Spring Cloud Stream + - name: JMS (ActiveMQ) + id: activemq + description: Java Message Service API via Apache ActiveMQ + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-jms/ + description: Messaging with JMS + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-activemq + - name: JMS (Artemis) + id: artemis + description: Java Message Service API via Apache Artemis + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-jms/ + description: Messaging with JMS + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-artemis + - name: WebSocket + id: websocket + description: WebSocket applications with SockJS and STOMP + links: + - rel: guide + href: https://spring.io/guides/gs/messaging-stomp-websocket/ + description: Using WebSocket to build an interactive web application + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-websockets + - name: RSocket + id: rsocket + versionRange: 2.2.0.M2 + description: RSocket.io applications with Spring Messaging and Netty + - name: Cloud Core + bom: spring-cloud + content: + - name: Cloud Bootstrap + id: cloud-starter + description: spring-cloud-context (e.g. Bootstrap context and @RefreshScope) + groupId: org.springframework.cloud + artifactId: spring-cloud-starter + weight: 100 + - name: Cloud Function + id: cloud-function + groupId: org.springframework.cloud + artifactId: spring-cloud-function-context + description: Functions as Spring Beans + versionRange: 2.0.2.RELEASE + links: + - rel: reference + href: https://cloud.spring.io/spring-cloud-function/ + - rel: sample + href: https://github.com/spring-cloud/spring-cloud-function/tree/master/spring-cloud-function-samples + description: Various sample apps using Spring Cloud Function + - name: Cloud Security + id: cloud-security + description: Secure load balancing and routing with spring-cloud-security + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-security + - name: Cloud OAuth2 + id: cloud-oauth2 + description: OAuth2 and distributed application patterns with spring-cloud-security + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-oauth2 + - name: Cloud Task + id: cloud-task + description: Task result tracking with Spring Batch and Spring Cloud Stream integrations + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-task + starter: false + - name: Cloud Support + content: + - name: Cloud Connectors + id: cloud-connectors + description: Simplifies connecting to services in cloud platforms, including spring-cloud-connector and spring-cloud-cloudfoundry-connector + - name: Open Service Broker + id: open-service-broker + description: Create service brokers that conform to the Open Service Broker API specification + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-open-service-broker-webmvc + versionRange: 2.0.0.RELEASE + version: 2.1.1.RELEASE + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-open-service-broker/docs/current/reference/html5/ + - rel: guide + href: https://github.com/spring-cloud-samples/bookstore-service-broker + description: Using Spring Cloud Open Service Broker + - name: Cloud Config + bom: spring-cloud + content: + - name: Config Client + id: cloud-config-client + description: Spring Cloud Config Client + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-config + weight: 100 + - name: Config Server + id: cloud-config-server + description: Central management for configuration via a git or svn backend + groupId: org.springframework.cloud + artifactId: spring-cloud-config-server + links: + - rel: guide + href: https://spring.io/guides/gs/centralized-configuration/ + description: Centralized Configuration + - name: Vault Configuration + id: cloud-starter-vault-config + description: Configuration management with HashiCorp Vault + versionRange: 1.5.3.RELEASE + starter: false + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-vault-config + - name: Zookeeper Configuration + id: cloud-starter-zookeeper-config + description: Configuration management with Zookeeper and spring-cloud-zookeeper-config + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-zookeeper-config + - name: Consul Configuration + id: cloud-starter-consul-config + description: Configuration management with Hashicorp Consul + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-consul-config + - name: Cloud Discovery + bom: spring-cloud + content: + - name: Eureka Discovery + id: cloud-eureka + description: Service discovery using spring-cloud-netflix and Eureka + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-eureka-client + weight: 100 + - name: Eureka Server + id: cloud-eureka-server + description: spring-cloud-netflix Eureka Server + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-eureka-server + links: + - rel: guide + href: https://spring.io/guides/gs/service-registration-and-discovery/ + description: Service Registration and Discovery + - name: Zookeeper Discovery + id: cloud-starter-zookeeper-discovery + description: Service discovery with Zookeeper and spring-cloud-zookeeper-discovery + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-zookeeper-discovery + - name: Cloud Foundry Discovery + id: cloud-cloudfoundry-discovery + description: Service discovery with Cloud Foundry + groupId: org.springframework.cloud + artifactId: spring-cloud-cloudfoundry-discovery + - name: Consul Discovery + id: cloud-starter-consul-discovery + description: Service discovery with Hashicorp Consul + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-consul-discovery + - name: Cloud Routing + bom: spring-cloud + content: + - name: Zuul + id: cloud-zuul + description: Intelligent and programmable routing with spring-cloud-netflix Zuul + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-zuul + links: + - rel: guide + href: https://spring.io/guides/gs/routing-and-filtering/ + description: Routing and Filtering + - name: Gateway + id: cloud-gateway + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-gateway + description: Intelligent and programmable routing with the reactive Spring Cloud Gateway + versionRange: 2.0.0.M5 + links: + - rel: guide + href: https://github.com/spring-cloud-samples/spring-cloud-gateway-sample + description: Using Spring Cloud Gateway + - name: Ribbon + id: cloud-ribbon + description: Client side load balancing with spring-cloud-netflix and Ribbon + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-ribbon + links: + - rel: guide + href: https://spring.io/guides/gs/client-side-load-balancing/ + description: Client Side Load Balancing with Ribbon and Spring Cloud + - name: Feign + id: cloud-feign + description: Declarative REST clients with spring-cloud-netflix Feign + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-openfeign + - name: Cloud Circuit Breaker + bom: spring-cloud + content: + - name: Hystrix + id: cloud-hystrix + description: Circuit breaker with spring-cloud-netflix Hystrix + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-hystrix + links: + - rel: guide + href: https://spring.io/guides/gs/circuit-breaker/ + description: Circuit Breaker + - name: Hystrix Dashboard + id: cloud-hystrix-dashboard + description: Circuit breaker dashboard with spring-cloud-netflix Hystrix + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-hystrix-dashboard + - name: Turbine + id: cloud-turbine + description: Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and server-sent events + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-turbine + - name: Turbine Stream + id: cloud-turbine-stream + description: Circuit breaker metric aggregation using spring-cloud-netflix with Turbine and Spring Cloud Stream (requires a binder, e.g. Kafka or RabbitMQ) + versionRange: 1.3.0.RELEASE + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-netflix-turbine-stream + weight: -1 + - name: Cloud Tracing + bom: spring-cloud + content: + - name: Sleuth + id: cloud-starter-sleuth + description: Distributed tracing via logs with spring-cloud-sleuth + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-sleuth + - name: Zipkin Client + id: cloud-starter-zipkin + description: Distributed tracing with an existing Zipkin installation and spring-cloud-sleuth-zipkin. Alternatively, consider Sleuth Stream. + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-zipkin + - name: Cloud Messaging + bom: spring-cloud + content: + - name: Cloud Bus + id: cloud-bus + description: A simple control bus using Spring Cloud Stream (requires a binder, e.g. Kafka or RabbitMQ) + groupId: org.springframework.cloud + artifactId: spring-cloud-bus + - name: Cloud Stream + id: cloud-stream + description: Messaging microservices with Spring Cloud Stream (requires a binder, e.g. Kafka or RabbitMQ) + weight: 90 + groupId: org.springframework.cloud + artifactId: spring-cloud-stream + - name: Reactive Cloud Stream + id: reactive-cloud-stream + description: Reactive messaging microservices with Spring Cloud Stream (requires a binder, e.g. Kafka or RabbitMQ) + versionRange: 2.0.0.RC2 + weight: 90 + groupId: org.springframework.cloud + artifactId: spring-cloud-stream-reactive + - name: Cloud Contract + bom: spring-cloud + content: + - name: Cloud Contract Verifier + id: cloud-contract-verifier + description: Test dependencies required for autogenerated tests + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-contract-verifier + scope: test + starter: false + - name: Cloud Contract Stub Runner + id: cloud-contract-stub-runner + description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-contract-stub-runner + scope: test + starter: false + - name: Pivotal Cloud Foundry + bom: spring-cloud-services + content: + - name: Config Client (PCF) + id: scs-config-client + description: Config client on Pivotal Cloud Foundry + groupId: io.pivotal.spring.cloud + artifactId: spring-cloud-services-starter-config-client + links: + - rel: reference + href: https://docs.pivotal.io/spring-cloud-services/ + description: Reference doc + - name: Service Registry Client (PCF) + id: scs-service-registry + description: Eureka service discovery client on Pivotal Cloud Foundry + groupId: io.pivotal.spring.cloud + artifactId: spring-cloud-services-starter-service-registry + links: + - rel: reference + href: https://docs.pivotal.io/spring-cloud-services/ + description: Reference doc + - name: Circuit Breaker Client (PCF) + id: scs-circuit-breaker + description: Hystrix circuit breaker client on Pivotal Cloud Foundry + groupId: io.pivotal.spring.cloud + artifactId: spring-cloud-services-starter-circuit-breaker + links: + - rel: reference + href: https://docs.pivotal.io/spring-cloud-services/ + description: Reference doc + - name: Amazon Web Services + bom: spring-cloud + content: + - name: AWS Core + id: cloud-aws + description: AWS native services from spring-cloud-aws + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-aws + - name: AWS JDBC + id: cloud-aws-jdbc + description: Relational databases on AWS with RDS and spring-cloud-aws-jdbc + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-aws-jdbc + - name: AWS Messaging + id: cloud-aws-messaging + description: Messaging on AWS with SQS and spring-cloud-aws-messaging + groupId: org.springframework.cloud + artifactId: spring-cloud-starter-aws-messaging + - name: Azure + bom: azure + versionRange: "1.5.4.RELEASE" + content: + - name: Azure Support + id: azure-support + groupId: com.microsoft.azure + artifactId: azure-spring-boot-starter + description: Auto-configuration for Azure Services (service bus, storage, active directory, cosmos DB, key vault and more) + links: + - rel: reference + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot + description: Reference doc + - name: Azure Active Directory + id: azure-active-directory + groupId: com.microsoft.azure + artifactId: azure-active-directory-spring-boot-starter + description: Spring Security integration with Azure Active Directory for authentication + links: + - rel: guide + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-active-directory-spring-boot-sample + description: Using Active Directory + - rel: reference + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-active-directory-spring-boot-starter + description: Reference doc + - name: Azure Key Vault + id: azure-keyvault-secrets + groupId: com.microsoft.azure + artifactId: azure-keyvault-secrets-spring-boot-starter + description: Spring value annotation integration with Azure Key Vault Secrets + links: + - rel: guide + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-keyvault-secrets-spring-boot-sample + description: Using Key Vault + - rel: reference + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-keyvault-secrets-spring-boot-starter + description: Reference doc + - name: Azure Storage + id: azure-storage + groupId: com.microsoft.azure + artifactId: azure-storage-spring-boot-starter + description: Azure Storage service integration + links: + - rel: guide + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-samples/azure-storage-spring-boot-sample + description: Using Azure Storage + - rel: reference + href: https://github.com/Microsoft/azure-spring-boot/tree/master/azure-spring-boot-starters/azure-storage-spring-boot-starter + description: Reference doc + - name: Google Cloud Platform + bom: spring-cloud + versionRange: 2.0.0.RELEASE + content: + - name: GCP Support + id: cloud-gcp + description: Support for Google Cloud Platform services + groupId: org.springframework.cloud + artifactId: spring-cloud-gcp-starter + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-gcp/docs/${local.gcp.version}/reference/htmlsingle/ + description: Reference doc + - rel: guide + href: https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples + description: Samples + - name: GCP Messaging + id: cloud-gcp-pubsub + description: Publish to and subcribe from Google Cloud Pub/Sub topics + groupId: org.springframework.cloud + artifactId: spring-cloud-gcp-starter-pubsub + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-gcp/docs/${local.gcp.version}/reference/htmlsingle/#_spring_cloud_gcp_for_pub_sub + description: Reference doc + - rel: guide + href: https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-sample + description: Sample + - name: GCP Storage + id: cloud-gcp-storage + description: Access Google Cloud Storage objects + groupId: org.springframework.cloud + artifactId: spring-cloud-gcp-starter-storage + links: + - rel: reference + href: https://docs.spring.io/spring-cloud-gcp/docs/${local.gcp.version}/reference/htmlsingle/#_spring_resources + description: Reference doc + - rel: guide + href: https://github.com/spring-cloud/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample + description: Sample + - name: I/O + content: + - name: Batch + id: batch + description: Spring Batch support + weight: 100 + links: + - rel: guide + href: https://spring.io/guides/gs/batch-processing/ + description: Creating a Batch Service + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#howto-batch-applications + - name: Mail + id: mail + description: Send email using Java Mail and Spring Framework's JavaMailSender + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-email + - name: Apache Camel + id: camel + versionRange: "1.5.0.RELEASE" + mappings: + - versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + version: 2.21.5 + - versionRange: "[2.0.0.M1,2.1.0.M1)" + version: 2.22.4 + - versionRange: "2.1.0.M1" + version: 2.23.2 + description: Integration using Apache Camel + groupId: org.apache.camel + artifactId: camel-spring-boot-starter + links: + - rel: guide + href: https://camel.apache.org/spring-boot + description: Using Apache Camel with Spring Boot + - name: LDAP + id: data-ldap + description: LDAP support, including spring-data-ldap + versionRange: 1.5.0.RELEASE + links: + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#boot-features-ldap + - name: Quartz Scheduler + id: quartz + versionRange: 2.0.0.M2 + description: Schedule jobs using Quartz + - name: Spring Shell + id: spring-shell + groupId: org.springframework.shell + artifactId: spring-shell-starter + description: Build shell-based clients + version: 2.0.0.RELEASE + repository: spring-milestones + links: + - rel: reference + href: https://docs.spring.io/spring-shell/docs/2.0.0.M2/reference/htmlsingle/ + - name: Statemachine + id: statemachine + groupId: org.springframework.statemachine + artifactId: spring-statemachine-starter + description: Build applications using state machine concepts + versionRange: 2.0.0.RC1 + bom: spring-statemachine + links: + - rel: reference + href: https://docs.spring.io/spring-statemachine/docs/current-SNAPSHOT/reference/htmlsingle/ + - rel: guide + href: https://docs.spring.io/spring-statemachine/docs/current-SNAPSHOT/reference/htmlsingle/#developing-your-first-spring-statemachine-application + description: Developing your first Spring Statemachine application + - name: Ops + content: + - name: Actuator + id: actuator + description: Production ready features to help you monitor and manage your application + links: + - rel: guide + href: https://spring.io/guides/gs/actuator-service/ + description: Building a RESTful Web Service with Spring Boot Actuator + - rel: reference + href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#production-ready + - name: Spring Boot Admin (Server) + id: codecentric-spring-boot-admin-server + groupId: de.codecentric + artifactId: spring-boot-admin-starter-server + description: An admin interface for Spring Boot applications + versionRange: "[1.5.9.RELEASE,2.2.0.M1)" + bom: codecentric-spring-boot-admin + links: + - rel: reference + href: https://codecentric.github.io/spring-boot-admin/current/#getting-started + - name: Spring Boot Admin (Client) + id: codecentric-spring-boot-admin-client + groupId: de.codecentric + artifactId: spring-boot-admin-starter-client + description: Register your application with a Spring Boot Admin instance + versionRange: "[1.5.9.RELEASE,2.2.0.M1)" + bom: codecentric-spring-boot-admin + links: + - rel: reference + href: https://codecentric.github.io/spring-boot-admin/current/#getting-started + - name: Actuator Docs + id: actuator-docs + description: API documentation for the Actuator endpoints + versionRange: "[1.5.0.RELEASE,2.0.0.M1)" + groupId: org.springframework.boot + artifactId: spring-boot-actuator-docs + types: + - name: Maven Project + id: maven-project + description: Generate a Maven based project archive + tags: + build: maven + format: project + default: true + action: /starter.zip + - name: Maven POM + id: maven-build + description: Generate a Maven pom.xml + tags: + build: maven + format: build + default: false + action: /pom.xml + - name: Gradle Project + id: gradle-project + description: Generate a Gradle based project archive + tags: + build: gradle + format: project + default: false + action: /starter.zip + - name: Gradle Config + id: gradle-build + description: Generate a Gradle build file + tags: + build: gradle + format: build + default: false + action: /build.gradle + packagings: + - name: Jar + id: jar + default: true + - name: War + id: war + default: false + javaVersions: + - id: 12 + default: false + - id: 11 + default: false + - id: 1.8 + name: 8 + default: true + languages: + - name: Java + id: java + default: true + - name: Kotlin + id: kotlin + default: false + - name: Groovy + id: groovy + default: false + bootVersions: + - name : Latest SNAPSHOT + id: 2.2.0.BUILD-SNAPSHOT + default: false + - name : 2.1.1. + id: 2.1.1.RELEASE + default: true + +--- + +spring: + profiles: dev + resources: + static_locations: + - file:start-client/build/ + chain: + strategy: + content: + enabled: false + devtools: + restart: + additional_paths: + - start-client/build/ + additional_exclude: "**/*.js,**/*.css" +