diff --git a/buildSrc/src/main/java/org/springframework/boot/build/JavaConventions.java b/buildSrc/src/main/java/org/springframework/boot/build/JavaConventions.java index b3e6377b3d..decff985ca 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/JavaConventions.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/JavaConventions.java @@ -231,9 +231,11 @@ class JavaConventions { .matching((configuration) -> configuration.getName().endsWith("Classpath") || JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME.equals(configuration.getName())) .all((configuration) -> configuration.extendsFrom(dependencyManagement)); - Dependency springBootParent = project.getDependencies().enforcedPlatform(project.getDependencies() - .project(Collections.singletonMap("path", ":spring-boot-project:spring-boot-parent"))); - dependencyManagement.getDependencies().add(springBootParent); + String path = project.getName().contains("spring-boot-starter") + ? ":spring-boot-project:spring-boot-dependencies" : ":spring-boot-project:spring-boot-parent"; + Dependency dependency = project.getDependencies() + .enforcedPlatform(project.getDependencies().project(Collections.singletonMap("path", path))); + dependencyManagement.getDependencies().add(dependency); project.getPlugins().withType(OptionalDependenciesPlugin.class, (optionalDependencies) -> configurations .getByName(OptionalDependenciesPlugin.OPTIONAL_CONFIGURATION_NAME).extendsFrom(dependencyManagement)); } diff --git a/spring-boot-project/spring-boot-parent/build.gradle b/spring-boot-project/spring-boot-parent/build.gradle index 99a7a241c9..8e68db4844 100644 --- a/spring-boot-project/spring-boot-parent/build.gradle +++ b/spring-boot-project/spring-boot-parent/build.gradle @@ -164,6 +164,13 @@ bom { ] } } + library("SnakeYAML", "1.31") { + group("org.yaml") { + modules = [ + "snakeyaml" + ] + } + } library("Spock Framework", "2.0-groovy-3.0") { group("org.spockframework") { modules = [ diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java index 16861bac0b..708a826cef 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/OriginTrackedYamlLoader.java @@ -45,6 +45,7 @@ import org.springframework.boot.origin.OriginTrackedValue; import org.springframework.boot.origin.TextResourceOrigin; import org.springframework.boot.origin.TextResourceOrigin.Location; import org.springframework.core.io.Resource; +import org.springframework.util.ReflectionUtils; /** * Class to load {@code .yml} files into a map of {@code String} to @@ -55,6 +56,9 @@ import org.springframework.core.io.Resource; */ class OriginTrackedYamlLoader extends YamlProcessor { + private static final boolean HAS_RESOLVER_LIMIT = ReflectionUtils.findMethod(Resolver.class, "addImplicitResolver", + Tag.class, Pattern.class, String.class, int.class) != null; + private final Resource resource; OriginTrackedYamlLoader(Resource resource) { @@ -75,7 +79,7 @@ class OriginTrackedYamlLoader extends YamlProcessor { BaseConstructor constructor = new OriginTrackingConstructor(loaderOptions); Representer representer = new Representer(); DumperOptions dumperOptions = new DumperOptions(); - LimitedResolver resolver = new LimitedResolver(); + Resolver resolver = HAS_RESOLVER_LIMIT ? new NoTimestampResolverWithLimit() : new NoTimestampResolver(); return new Yaml(constructor, representer, dumperOptions, loaderOptions, resolver); } @@ -167,7 +171,7 @@ class OriginTrackedYamlLoader extends YamlProcessor { /** * {@link Resolver} that limits {@link Tag#TIMESTAMP} tags. */ - private static class LimitedResolver extends Resolver { + private static class NoTimestampResolver extends Resolver { @Override public void addImplicitResolver(Tag tag, Pattern regexp, String first) { @@ -179,4 +183,19 @@ class OriginTrackedYamlLoader extends YamlProcessor { } + /** + * {@link Resolver} that limits {@link Tag#TIMESTAMP} tags. + */ + private static class NoTimestampResolverWithLimit extends Resolver { + + @Override + public void addImplicitResolver(Tag tag, Pattern regexp, String first, int limit) { + if (tag == Tag.TIMESTAMP) { + return; + } + super.addImplicitResolver(tag, regexp, first, limit); + } + + } + }